2013-02-19 1 views
4

First example:Динамически создавать сложные запросы с Q() в Django

# 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
А также - это хорошее решение для использования «&» с объектами Q()? В Django-документах я ничего не нашел об этом!

ответ

5

Проверить 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) 
0

использование Q является документированная особенность и является публичной Django API. Это означает, что он стабилен и не исчезнет в соответствии с политикой обратной совместимости Django.

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

+0

Я имел в виду не использования Q() в общем, но использование его в таких специфических формах –

+0

не видит, что особенный в вашем использовании Q. Вы просто используете свой публичный интерфейс. – mderk

+0

В документах я ничего не вижу о «&» операторе и динамическом построении запроса Q(). –

Смежные вопросы