在查询集上寻找Django any()和all()

时间:2012-04-05 22:29:31

标签: django combinations django-queryset

我有一个包含13个复选框的表单,它们共同构成了我的搜索条件......除了我还为ALL或ANY添加了一对单选按钮。

我希望能得到一些优雅的东西:

priority_ids = request.GET.getlist("priority")  # checkboxes
collection   = request.GET.get("collection")    # radio buttons
priorities = []
for priority_id in priority_ids:
    priorities.append(Q(focus__priority=priority_id))
if   (collection == "any"): qset = any(priorities)
elif (collection == "all"): qset = all(priorities)

但是,any()和all()返回一个布尔值,而不是我可以在过滤器中使用的查询集。我想要一个“任何”或“全部”,相当于“Q(...)| Q(...)| Q(...)”或“Q(...)& Q(。 ..)& Q(...)“适用于1到13个标准。

1 个答案:

答案 0 :(得分:1)

Django没有什么需要做的。您只需要将Q - s与&|分别以简单的循环或以reduce更紧凑的方式合并。

关于术语,我觉得你在调用Q一个查询集,但事实并非如此。它是查询集的过滤器。 像下面这样的东西应该有效:

priority_ids = request.GET.getlist("priority")
collection   = request.GET.get("collection")
priority_filters = []
for priority_id in priority_ids:
    priority_filters.append(Q(focus__priority=priority_id))

base_qs = SomeModel.objects.all()

if collection == "any":
   filtered_qset = base_qs.filter(reduce(operator.or_, priority_filters))
elif collection == "all":
   filtered_qset = base_qs.filter(reduce(operator.and_, priority_filters))