Описание тега django-q
В общем, объекты Q() позволяют определять и повторно использовать условия. Это позволяет создавать сложные запросы к базе данных с помощью | Операторы (ИЛИ) и & (И); в частности, иначе невозможно использовать OR в QuerySets.
Сложный поиск с объектами Q
Запросы с аргументами ключевого слова - в filter() и т. Д. - объединяются "И". Если вам нужно выполнить более сложные запросы (например, запросы с OR заявления), вы можете использовать объекты Q.
Объект Q (django.db.models.Q) - это объект, используемый для инкапсуляции коллекции аргументов ключевого слова. Эти аргументы ключевых слов указаны как в разделе "Поиск полей" выше.
Например, этот объект Q инкапсулирует один запрос LIKE:
from django.db.models import Q
Q(question__startswith='What')
Объекты Q можно комбинировать с помощью & и | операторы. Когда оператор используется с двумя объектами Q, он дает новый объект Q.
Например, этот оператор дает один объект Q, который представляет собой "ИЛИ" двух запросов "question__startswith":
Q(question__startswith='Who') | Q(question__startswith='What')
Это эквивалентно следующему предложению SQL WHERE:
WHERE question LIKE 'Who%' OR question LIKE 'What%'
Вы можете составлять операторы произвольной сложности, комбинируя объекты Q с помощью & и | операторы и используйте группировку в скобках. Кроме того, объекты Q могут быть инвертированы с помощью оператора ~, что позволяет выполнять комбинированный поиск, который объединяет как обычный запрос, так и отрицательный (НЕ) запрос:
Q(question__startswith='Who') | ~Q(pub_date__year=2005)
Каждой функции поиска, которая принимает ключевые аргументы (например, filter(), exclude(), get()), также можно передать один или несколько объектов Q в качестве позиционных (безымянных) аргументов. Если вы предоставите несколько аргументов объекта Q для функции поиска, аргументы будут объединены "И" вместе. Например:
Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
... примерно переводится на SQL:
SELECT * from polls WHERE question LIKE 'Who%'
AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
Функции поиска могут смешивать использование объектов Q и аргументов ключевого слова. Все аргументы, предоставленные функции поиска (будь то аргументы ключевого слова или объекты Q), объединяются "И". Однако, если предоставляется объект Q, он должен предшествовать определению любых аргументов ключевого слова. Например:
Poll.objects.get(
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
question__startswith='Who')
... будет допустимым запросом, эквивалентным предыдущему примеру; но:
# INVALID QUERY
Poll.objects.get(
question__startswith='Who',
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))
... недействительно.