我花了好几个小时来处理ManyToMany字段类型的查询集。我想通过在GET
上使用model B
来与其他对象(model A
)具有ManyToMany关系的filter
对象(model A
)。
views.朋友
我从my_user_id
得到urls.py
,这是str
。 id
部分工作正常,但......
class UserUserId(generics.RetrieveUpdateAPIView):
#permission_classes = (IsOwner,)
queryset = User.objects.all()
serializer_class = UserSerializer #serializer for User model
def get(self, *args, **kwargs):
id = self.kwargs['my_user_id']
return self.queryset.filter(user_id=id).user_schedules.all()
URLs.朋友
path('user/<str:my_user_id>', views.UserUserId.as_view()),
models.朋友
class User(models.Model):
user_id = models.TextField(blank=True, null=True)
user_schedules = models.ManyToManyField('Schedule',
related_name='%(class)s_id')
class Schedule(models.Model):
sched_id = models.IntegerField(blank=True, null=True)
sched_name = models.TextField(blank=True, null=True)
它给了我以下错误:AttributeError:'QuerySet'对象没有属性'user_schedules'我试图通过将[0]
放在filter()
的末尾来解决这个问题,但它似乎错了,如果我必须检查多个用户它不起作用对象。
那么我怎样才能获得user_schedules
列出的特定User
user_id
是my_user_id
?
我被困在这几个小时,任何帮助将不胜感激。
首先,我认为您可能想要使用不同的序列化程序(类似于SchedulerSerializer
),因为您建议您要序列化,以及Schedule
s。
您可以使用给定的Schedule
获得User
的所有user_id
:
class UserUserId(generics.RetrieveUpdateAPIView):
#permission_classes = (IsOwner,)
queryset = Schedule.objects.all()
serializer_class = UserSerializer #serializer for User model
def get(self, *args, **kwargs):
id = self.kwargs['my_user_id']
return self.queryset.filter(user__user_id=id)
因此,我们查询Schedule
模型,并过滤,以便我们检索所有Schedule
s,其中存在与User
相关的user_id=id
。
您希望获取实例的数据,但您的代码正在尝试从查询集中获取数据。
以下几行应该可以帮到你:
class UserUserId(generics.RetrieveUpdateAPIView):
#permission_classes = (IsOwner,)
queryset = User.objects.all()
serializer_class = UserSerializer #serializer for User model
def get(self, *args, **kwargs):
id = self.kwargs['my_user_id']
user = User.objects.get(id=id)
return list(user.user_schedules.all())