使用djangoORM在视图集中使用Q()和filter()创建合并查询时出错

我正在尝试为MOdelViewSet的查询集中创建一个包含多个元素的过滤器。我正在覆盖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")
           )

queryset乘以注册表数,并带来许多结果(重复的结果),以至于请求失败。

这是完整的方法:

    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

ling9012 回答:使用djangoORM在视图集中使用Q()和filter()创建合并查询时出错

Ben认为,解决方案是使用distinct()方法来避免重复的结果。因此,最终查询集的工作方式如下:

 base_qs=Cohort.objects.filter(
            Q(participant__user__id=self.request.user.id) |
            Q(mode="p")
        ).distinct()
本文链接:https://www.f2er.com/3141793.html

大家都在问