使用Django中的Q()动态构建复杂查询

时间:2013-02-19 12:32:49

标签: python django filter django-queryset django-q

First example:

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

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

Second example:

>>> 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
而且 - 使用“&amp;”是一个很好的解决方案运算符与Q()对象?在Django-docs中,我一无所获!

2 个答案:

答案 0 :(得分:6)

检查the doc
可以使用&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)

答案 1 :(得分:0)

Q用法是一个记录的功能,是一个公共的Django API。这确实意味着它是稳定的,并且不会根据Django向后兼容性政策消失。

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