10

我有一个表格,允许您选择多个项目类型进行过滤。例如,假设您有项目类型“研究”、“培训”和“评估”。

基本上我想做的是使用 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 对象的查询集呢?

4

1 回答 1

25

您只是在构建一个与实际Q()查询对象无关的字符串;从第一个Q()实例开始并添加更多:

query = Q(type__type=types[0])
for t in types[1:]:
    query |= Q(type__type=t)
projects.filter(query)

您也可以使用该functools.reduce()函数来执行此操作:

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(..)对象并将它们组合成一个更大的查询,其中所有部分都与|或操作相结合。

于 2013-11-26T16:24:08.007 回答