Класс Q

Класс Q применяется для создания сложных запросов к базе данных, которые требуют логических операций, таких как И, ИЛИ и НЕ. Обычный filter с несколькими аргументами объединяет их через И, но Q позволяет гибко комбинировать условия с помощью битовых операторов & (И), | (ИЛИ) и ~ (НЕ). Объекты Q могут быть переданы в методы filter, exclude и другие.

Синтаксис

pythonfrom django.db.models import Q

# Создание объекта Q с условием
Q(поле__оператор=значение)

Пример

Давайте найдем все статьи, у которых статус "published" или автор имеет имя "admin":

pythonfrom 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)

Результат выполнения кода:

python"first article"
"second article"
"admin post"

Пример

Найдем статьи, которые не находятся в статусе "draft" и не имеют тега "archive":

pythonfrom 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)

Результат выполнения кода:

python"first article"
"published post"

Пример

Создадим сложный запрос, который объединяет несколько условий с помощью скобок:

pythonfrom 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)

Результат выполнения кода:

python"popular article"
"featured 2025 post"

Пример

Используем Q внутри exclude для исключения записей, которые соответствуют сложному условию:

pythonfrom 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)

Результат выполнения кода:

python"first article"
"popular article"

Смотрите также

  • класс F,
    который позволяет выполнять операции с полями модели на уровне базы данных
  • метод filter,
    который фильтрует QuerySet по заданным условиям
  • метод exclude,
    который исключает записи из QuerySet
  • метод get,
    который получает одну запись из базы данных