Django)在多对多关系视图中进行查询集过滤
Django) queryset filtering in view with ManyToMany Relationship
我花了几个小时处理 ManyToMany 字段类型的查询集。
我想 GET
对象 (model B
) 与另一个对象 (model A
) 有多对多关系,通过在 model A
.
上使用 filter
views.py
我从 urls.py
得到 my_user_id
,即 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.py
path('user/<str:my_user_id>', views.UserUserId.as_view()),
models.py
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
?
我坚持了好几个小时,如果有任何帮助,我们将不胜感激。
您想获取实例的数据,但您的代码正试图从查询集中获取数据。
以下几行应该可以帮助您:
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())
首先,我认为您可能想使用不同的序列化程序(类似于 SchedulerSerializer
),因为您建议您要序列化,嗯,Schedule
s。
您可以使用给定的 user_id
获得 User
的所有 Schedule
s:
class UserUserId(generics.RetrieveUpdateAPIView):
#permission_classes = (IsOwner,)
queryset = <b>Schedule</b>.objects.all()
serializer_class = UserSerializer #serializer for User model
def get(self, *args, **kwargs):
id = self.kwargs['my_user_id']
return self.queryset.filter(<b>user__user_id=</b>id)
因此,我们查询 Schedule
模型,并进行过滤,以便我们检索存在 的 all Schedule
s 与 user_id=id
.
相关 User
我花了几个小时处理 ManyToMany 字段类型的查询集。
我想 GET
对象 (model B
) 与另一个对象 (model A
) 有多对多关系,通过在 model A
.
filter
views.py
我从 urls.py
得到 my_user_id
,即 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.py
path('user/<str:my_user_id>', views.UserUserId.as_view()),
models.py
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
?
我坚持了好几个小时,如果有任何帮助,我们将不胜感激。
您想获取实例的数据,但您的代码正试图从查询集中获取数据。
以下几行应该可以帮助您:
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())
首先,我认为您可能想使用不同的序列化程序(类似于 SchedulerSerializer
),因为您建议您要序列化,嗯,Schedule
s。
您可以使用给定的 user_id
获得 User
的所有 Schedule
s:
class UserUserId(generics.RetrieveUpdateAPIView):
#permission_classes = (IsOwner,)
queryset = <b>Schedule</b>.objects.all()
serializer_class = UserSerializer #serializer for User model
def get(self, *args, **kwargs):
id = self.kwargs['my_user_id']
return self.queryset.filter(<b>user__user_id=</b>id)
因此,我们查询 Schedule
模型,并进行过滤,以便我们检索存在 的 all Schedule
s 与 user_id=id
.
User