我有一个表单,允许您选择要过滤的多个项目类型。例如,假设您有项目类型"研究","培训"和"评估"。
基本上我要做的是使用Q对象构建查询集,如:
projects.filter(Q(type__type="Research") | Q(type__type="Training"))
我只是不确定如何在没有filter()输入为字符串的情况下构建它,这会产生错误:
querystring = ""
for t in types:
querystring += " | Q(type__type="+t+")"
projects.filter(querystring) ## produces error: "ValueError: too many values to unpack"
那么什么是迭代类型以创建具有Q对象的查询集的方法?
答案 0 :(得分:8)
您只是构建一个与实际Q()
查询对象无关的字符串;从第一个Q()
实例开始,添加更多:
query = Q(type__type=types[0])
for t in types[1:]:
query |= Q(type__type=t)
projects.filter(query)
您也可以使用functools.reduce()
function执行此操作:
from functools import reduce
from operator import or_
query = reduce(or_, (Q(type__type=t) for t in types))
projects.filter(query)
reduce()
调用与上面的for
循环完全相同;获取一系列Q(..)
个对象,并将它们组合成一个更大的查询,其中所有部分与|
或操作相结合。