使用 djangoORM 在视图集中使用 Q() 和 filter() 创建合并查询时出错
Error creating merged queries with Q() and filter() in a viewset with djangoORM
我正在尝试为 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增加了registry的数量,结果很多,重复的结果,导致请求失败。
这是完整的方法:
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()
我正在尝试为 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增加了registry的数量,结果很多,重复的结果,导致请求失败。
这是完整的方法:
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()