【发布时间】:2010-10-14 10:36:07
【问题描述】:
如何传递 Q 列表以过滤 OR 查找?比如:
q_list = [Q(xyz__isnull=True), Q(x__startswith='x')]?
如果没有清单,我会这样做:
Model.objects.filter(Q(xyz__isnull=True) | Q(x__startswith='x'))
【问题讨论】:
标签: 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'))
【问题讨论】:
标签: django orm django-models lookup
使用python的reduce()函数:
import operator
reduced_q = reduce(operator.or_, q_list)
Model.objects.filter(reduced_q)
【讨论】:
reduce 不再是 Python 3 的内置功能,因此您可以改用 docs.python.org/3/library/functools.html#functools.reduce。
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
【讨论】: