如何传递Q列表以过滤OR查找?

时间:2009-03-19 22:44:39

标签: django orm django-models lookup

如何传递Q列表以过滤OR查找?类似的东西:

q_list = [Q(xyz__isnull=True), Q(x__startswith='x')]?

没有列表,我会这样做:

Model.objects.filter(Q(xyz__isnull=True) | Q(x__startswith='x'))

2 个答案:

答案 0 :(得分:15)

使用python的reduce()函数:

import operator
reduced_q = reduce(operator.or_, q_list)
Model.objects.filter(reduced_q)

答案 1 :(得分:7)

Q对象也有一个add方法,它接受另一个Q对象和一个Q连接器(AND或OR)。

q_object = Q(xyz__isnull=True)
q_object.add(Q(x__startswith='x'), Q.OR)

我发现这在构建OR过滤器时很有用,我在博客上写了一个更长的例子:"Adding" Q objects in Django