在Django中动态构建复杂查询与Q()

7 投票
2 回答
6143 浏览
提问于 2025-04-17 16:21

第一个例子:

# ANDing Q objects
q_object = Q()
q_object.add(Q(), Q.AND)

# ORing Q objects
q_object = Q()
q_object.add(Q(), Q.OR)

第二个例子:

>>> import operator
# create a list of Q objects
>>> mylist = [Q(question__contains='dinner'), Q(question__contains='meal')]
# OR
>>> Poll.objects.filter(reduce(operator.or_, mylist))
[<Poll: what shall I make for dinner>, <Poll: what is your favourite meal?>]
# AND
>>> Poll.objects.filter(reduce(operator.and_, mylist))
[]

这个技巧可能非常有用,比如在像eBay这样的网页上构建带有条件过滤的查询。

不过我知道这些内容并没有详细的文档说明,那么在这方面有没有什么好的实践方法,可以确保不会被淘汰,也不会让阅读我代码的人感到困惑呢?

ps
另外,使用"&"运算符和Q()对象结合起来是否是个好主意?在Django的文档中我没有找到相关的信息!

2 个回答

0

Q的使用是一个有文档说明的功能,也是Django的公开接口。这意味着它是稳定的,不会因为Django的向后兼容政策而消失。

https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

10

查看一下这个文档
使用&或者operator.and_来表示'AND'是没问题的,或者可以用更简短的方式:

>>> mylist = [Q(question__contains='dinner'), Q(question__contains='meal')]
# AND
>>> Poll.objects.filter(reduce(operator.and_, mylist))
# could be 
>>> Poll.objects.filter(*mylist)

撰写回答