我有一个包含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个标准。
答案 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))