在带有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")
)

查询集将注册表的数量相乘,并产生许多重复的结果,直到请求失败。

这是完整的方法:

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

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

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

相关内容

  • 没有找到相关文章

最新更新