Ответ
Объекты Q в Django ORM предназначены для построения сложных SQL-запросов, которые требуют использования логических операторов OR и NOT. Стандартные вызовы .filter() объединяются через AND, а Q-объекты дают полный контроль над логикой.
Основные операторы:
|(вертикальная черта) — логическое OR&(амперсанд) — логическое AND~(тильда) — логическое NOT
Это позволяет создавать динамические и читаемые запросы, которые сложно или невозможно составить путем простого последовательного вызова .filter().
Пример:
Найти всех пользователей, у которых имя начинается с 'A' ИЛИ которые неактивны.
from django.db.models import Q
from django.contrib.auth.models import User
# Запрос с использованием Q-объектов
users = User.objects.filter(
Q(username__startswith='A') | Q(is_active=False)
)
Более сложный пример:
Найти продукты, которые стоят меньше 1000 И (являются новинками ИЛИ их нет в наличии).
from django.db.models import Q
from myapp.models import Product
products = Product.objects.filter(
Q(price__lt=1000) & (Q(is_new=True) | Q(in_stock=False))
)
Без Q-объектов для подобных запросов пришлось бы выполнять несколько отдельных запросов к базе данных или писать сырой SQL.