具有ManyToMany关系的Django)查询集过滤

时间:2019-05-01 18:57:05

标签: django django-rest-framework django-views django-queryset django-urls

我已经花了很多时间来处理ManyToMany字段类型的查询集。 我想通过在GET上使用model Bmodel A个对象(filter)与另一个对象(model A)具有多对多关系。

views.py

我从my_user_id的{​​{1}}获得了urls.pystr部分工作正常,但是...

id

urls.py

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()

models.py

path('user/<str:my_user_id>', views.UserUserId.as_view()),

它给了我以下错误: AttributeError:“ QuerySet”对象没有属性“ user_schedules” 我试图通过将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) 放在[0]的末尾来解决此问题,但是这似乎是错误的,并且如果我必须检查多个User对象,这是行不通的。

那么如何获取filter()user_schedules的特定User的{​​{1}}列表?

我坚持了几个小时,任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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())

答案 1 :(得分:2)

首先,我认为您可能希望使用其他序列化器(类似SchedulerSerializer),因为您建议您要序列化Schedule

您可以使用给定的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模型上进行查询,并进行过滤,以便我们检索与相关 {{ 1}}和Schedule