Как в Django ORM выполнить запрос с логическим условием ИЛИ (OR)?

«Как в Django ORM выполнить запрос с логическим условием ИЛИ (OR)?» — вопрос из категории Django, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для выполнения запросов с условием OR в Django ORM используются объекты Q из модуля django.db.models.

Почему это необходимо? По умолчанию, несколько условий в одном вызове .filter() или в нескольких последовательных вызовах .filter() объединяются с помощью логического AND.

# Этот запрос ищет: status='published' AND author='admin'
Article.objects.filter(status='published', author='admin')

Для создания OR условий необходимо использовать оператор | между Q объектами.

Пример использования Q для OR:

from django.db.models import Q
from .models import Article

# Найти статьи, которые либо не опубликованы, ЛИБО их рейтинг выше 5
articles = Article.objects.filter(
    Q(is_published=False) | Q(rating__gt=5)
)

Комбинирование операторов

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

  • | (ИЛИ)
  • & (И)
  • ~ (НЕ)

Пример сложного запроса:

# Найти статьи, где (заголовок содержит 'Django' ИЛИ 'Python') И (рейтинг > 4)
complex_query = Article.objects.filter(
    (Q(title__icontains='Django') | Q(title__icontains='Python')) & Q(rating__gt=4)
)

Таким образом, Q объекты являются мощным инструментом для построения любых сложных WHERE выражений в SQL-запросах через Django ORM.