6

第一个例子:

# 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-docs 中,我一无所获!

4

2 回答 2

8

检查doc
可以使用&oroperator.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)
于 2013-02-19T13:05:29.283 回答
0

Q 用法是一个文档化的特性,并且是一个公共的 Django API。这确实意味着它是稳定的,并且根据 Django 向后兼容性策略不会消失。

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

于 2013-02-19T13:06:47.460 回答