【问题标题】:Django) queryset filtering in view with ManyToMany RelationshipDjango)查询集过滤视图中的多对多关系
【发布时间】:2019-09-20 07:31:21
【问题描述】:

我一直在多对多字段类型的查询集处理上花费数小时。 我想通过在model A 上使用filter 与另一个对象(model A)具有多对多关系的GET 对象(model B)。

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

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

【问题讨论】:

  • 但是这里要返回相关的user_schedules?而serializerUserSerializer?那么序列化程序不应该是ScheduleSerializer吗?
  • 哦,我认为你是对的。但这并不能解决问题。出现同样的错误???关于查询类型..

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


【解决方案1】:

您想获取实例的数据,但您的代码正试图从查询集中获取数据。

以下几行应该可以帮助您:

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

【讨论】:

  • 感谢您的回答。顺便说一句,它给了我另一个错误:AssertionError: Expected a Response, HttpResponse or HttpStreamingResponse to be returned from the view, but received a &lt;class 'django.db.models.query.QuerySet'&gt;
  • 我一直在处理这两个错误。我还想不通。也许是因为我们使用了 .all() ?
  • 你应该序列化这个查询集。
  • 我更改了代码,以便将查询集转换为列表。
【解决方案2】:

首先,我认为您可能想要使用不同的序列化程序(例如SchedulerSerializer),因为您建议您要序列化,嗯,Schedules。

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

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 和@987654330 @。

【讨论】:

  • 我可以使用user 过滤计划查询集吗?在计划模型中没有名为 user 的字段。它给了我这个消息:FieldError at /user/user1 Cannot resolve keyword 'user' into field. Choices are: sched_id, sched_name 如何匹配具有多对多关系的对象..???
  • 我试过myUser = self.queryset.get(user_id=id)然后返回myUser.user_schedules.all(),但它也给了我这个错误:AssertionError: `Response`, `HttpResponse` or `HttpStreamingResponse` to be returned from the view, but received a `&lt;class 'django.db.models.query.QuerySet'&gt;`
猜你喜欢
  • 1970-01-01
  • 2020-01-24
  • 2016-11-07
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2015-08-08
相关资源
最近更新 更多