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,即 strid 部分工作正常,但是...

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_idmy_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),因为您建议您要序列化,嗯,Schedules。

您可以使用给定的 user_id 获得 User 的所有 Schedules:

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 Schedules user_id=id.

相关 User