问题
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))
[]
This technique might be very useful, for building queries for pages with conditional-filters for example, like on eBay.
But this things, as I know - not documented, so what best practices are exist for this matter, which will not be dropped from support, and will not confuse people who will read my code?
ps
And also - is it good solution to use "&" operator with Q() objects? In Django-docs I found nothing about it!
回答1:
Check the doc
It's fine to use &
or operator.and_
to represent 'AND'
, or shorter:
>>> mylist = [Q(question__contains='dinner'), Q(question__contains='meal')]
# AND
>>> Poll.objects.filter(reduce(operator.and_, mylist))
# could be
>>> Poll.objects.filter(*mylist)
回答2:
Q usage is a documented feature and is a public Django API. That does mean it is stable and will not go away according to the Django backwards compatibility policy.
https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects
来源:https://stackoverflow.com/questions/14957595/dynamically-build-complex-queries-with-q-in-django