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

Ответ

Для выполнения запросов с условием 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.

Ответ 18+ 🔞

Так, слушай, про эти ваши Django ORM запросы. Ситуация, блядь, классическая: ты фильтруешь по двум полям и думаешь, что это «ИЛИ», а на самом деле получается «И». Ну, стандартный пиздец, да.

В чём, собственно, засада? По дефолту, когда ты пишешь несколько условий в filter() или цепочкой их добавляешь, они склеиваются через AND. То есть, это как требовать от мира: «Дай мне всё, что одновременно и то, и другое». А жизнь-то, блядь, сложнее бывает.

# Это ищет: status='published' И author='admin' одновременно. Хуй ты найдёшь что-то, если одно из условий не выполняется.
Article.objects.filter(status='published', author='admin')

Спасительный Q объект, ёпта! Чтобы сказать «или то, или другое», надо импортировать этого красавца и использовать оператор | (палочку, блядь, вертикальную).

Простой пример, чтобы въехать:

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 выражений, без которых в нормальном проекте — просто ни хуя не обойтись. Запомни эту палочку | и живи спокойно.