Класс Q
Класс Q применяется для создания сложных запросов к базе данных, которые требуют логических операций, таких как И, ИЛИ и НЕ. Обычный filter с несколькими аргументами объединяет их через И, но Q позволяет гибко комбинировать условия с помощью битовых операторов & (И), | (ИЛИ) и ~ (НЕ). Объекты Q могут быть переданы в методы filter, exclude и другие.
Синтаксис
from django.db.models import Q
# Создание объекта Q с условием
Q(поле__оператор=значение)
Пример
Давайте найдем все статьи, у которых статус "published" или автор имеет имя "admin":
from myapp.models import Article
from django.db.models import Q
res = Article.objects.filter(
Q(status='published') | Q(author__username='admin')
)
for article in res:
print(article.title)
Результат выполнения кода:
"first article"
"second article"
"admin post"
Пример
Найдем статьи, которые не находятся в статусе "draft" и не имеют тега "archive":
from myapp.models import Article
from django.db.models import Q
res = Article.objects.filter(
~Q(status='draft') & ~Q(tags__name='archive')
)
for article in res:
print(article.title)
Результат выполнения кода:
"first article"
"published post"
Пример
Создадим сложный запрос, который объединяет несколько условий с помощью скобок:
from myapp.models import Article
from django.db.models import Q
res = Article.objects.filter(
(Q(status='published') & Q(views__gt=100)) |
(Q(status='featured') & Q(created_at__year=2025))
)
for article in res:
print(article.title)
Результат выполнения кода:
"popular article"
"featured 2025 post"
Пример
Используем Q внутри exclude для исключения записей, которые соответствуют сложному условию:
from myapp.models import Article
from django.db.models import Q
res = Article.objects.exclude(
Q(status='archived') | Q(views__lt=10)
)
for article in res:
print(article.title)
Результат выполнения кода:
"first article"
"popular article"