Django)使用ManyToMany关系在视图中进行查询集过滤

问题描述 投票:2回答:2

我花了好几个小时来处理ManyToMany字段类型的查询集。我想通过在GET上使用model B来与其他对象(model A)具有ManyToMany关系的filter对象(model A)。

views.朋友

我从my_user_id得到urls.py,这是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.朋友

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_idmy_user_id

我被困在这几个小时,任何帮助将不胜感激。

django django-rest-framework django-views django-queryset django-urls
2个回答
2
投票

首先,我认为您可能想要使用不同的序列化程序(类似于SchedulerSerializer),因为您建议您要序列化,以及Schedules。

您可以使用给定的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模型,并过滤,以便我们检索所有Schedules,其中存在与User相关的user_id=id


3
投票

您希望获取实例的数据,但您的代码正在尝试从查询集中获取数据。

以下几行应该可以帮到你:

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())
© www.soinside.com 2019 - 2024. All rights reserved.