Dynamically build complex queries with Q() in Django [closed]

假如想象 提交于 2019-12-10 17:12:14

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!