我通过以下方式将节点链接到Q
对象:
q = Q()
for filter in filters:
if filter_applies(filter):
q.add(Q(some_criteria), Q.OR)
什么意味着q
对象可能已经或可能没有被链接到节点。稍后我试图在过滤器中应用q
对象,但前提是这不是为空:
if q.not_empty():
some_query_set.filter(q)
如何检查q
与定义时的不同?
答案 0 :(得分:1)
如果您想检查q
是否为空,可以查看其长度:
>>> q = Q()
>>> len(q)
0
或者,您可以先准备要应用的dict
个过滤器:
lookups = {}
for filter in filters:
if filter_applies(filter):
lookups[filter] = some_criteria
然后,您可以使用Q
对象检查其非空是否应用过滤器:
import operator
if lookups:
qs = qs.filter(reduce(operator.or_, [Q(f) for f in lookups.items()]))
答案 1 :(得分:0)
一个空的Q对象是虚假的(bool(Q())
的值为False
),所以我认为您应该以这种方式进行检查:
if q:
some_query_set.filter(q)
您不应该检查length == 0,因为该表达式花费更多。