Django:如何检查Q对象是否为空?

时间:2017-05-26 09:36:59

标签: python django

我通过以下方式将节点链接到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与定义时的不同?

2 个答案:

答案 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,因为该表达式花费更多。