【问题标题】:Error creating merged queries with Q() and filter() in a viewset with djangoORM使用 djangoORM 在视图集中使用 Q() 和 filter() 创建合并查询时出错
【发布时间】:2020-03-04 11:46:40
【问题描述】:

我正在尝试在查询集中为模型视图集创建一个包含多个元素的过滤器。我正在覆盖 get_queryset 方法以根据用户角色获取结果。

我正在使用 Q() 并且当我尝试使用单个过滤器时效果很好,例如:

 Cohort.objects.filter(Q(mode="p") )

或者这个:

 Cohort.objects.filter(Q(participant__user__id=self.request.user.id))

两者都可以完美地过滤查询集,但是当我结合起来时...

Cohort.objects.filter(
                Q(participant__user__id=self.request.user.id) |
                Q(mode="p")
           )

查询集增加了注册表的数量,并带来了许多结果,重复的结果,以至于请求失败。

这是完整的方法:

    def get_queryset(self):
        user_role = self.request.user.rol

        if user_role == '0':
            base_qs=Cohort.objects.all()
        elif user_role == '1':
            base_qs=Cohort.objects.filter(
                Q(participant__user__id=user.id)
            )
        elif user_role == '2':
            base_qs = Cohort.objects.filter(
                Q(participant__user__id=self.request.user.id) |
                Q(mode="p")
            )

        scope = self.request.query_params.get('isNext', None)

        if scope is None:
            return base_qs
        elif scope:
            return base_qs.filter(fecha_final > datetime.date.today())
        return base_qs.filter(fecha_final < datetime.date.today())

我没有收到任何错误消息。检查文档这是使用 Q 的方式,但发生了一些事情。我究竟做错了什么? 我正在使用

Django==2.2.4

djangorestframework==3.10.2

【问题讨论】:

  • 只要您打算获取请求用户的所有对象 OR(即加号)而不是 AND(交集)所有 mode="p" 的对象,查询对我来说似乎没问题。您能否尝试分别运行两个查询(当前用户和 mode=p)并计算它们产生多少对象?我们现在 OR 应该产生
  • 如果您收到意外的重复结果,您可以将.distinct() 添加到您的过滤查询中。

标签: django python-3.x django-rest-framework django-queryset django-rest-viewsets


【解决方案1】:

正如 Ben 所建议的,解决方案是使用 distinct() 方法来避免重复的结果。所以最终的查询集是这样工作的:

 base_qs=Cohort.objects.filter(
            Q(participant__user__id=self.request.user.id) |
            Q(mode="p")
        ).distinct()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 2020-01-31
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2015-03-18
    相关资源
    最近更新 更多