📝 Django

Q-объекты в Django ORM

P
Автор
PyLand Team
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
290
🌳
Уровень
Продвинутый

Q-объекты позволяют строить сложные условия с OR, AND, NOT.

Проблема без Q

# Обычный filter — только AND
Task.objects.filter(status='todo', priority=3)
# WHERE status='todo' AND priority=3
# Нельзя напрямую:
Task.objects.filter(status='todo' OR priority=3)  # SyntaxError!

Базовое использование

from django.db.models import Q

# OR
Task.objects.filter(Q(status='todo') | Q(status='in_progress'))

# AND (то же что обычный filter)
Task.objects.filter(Q(status='todo') & Q(priority__gte=3))

# NOT
Task.objects.filter(~Q(status='done'))

Сложные комбинации

# (статус todo ИЛИ in_progress) И (приоритет высокий ИЛИ срок просрочен)
Task.objects.filter(
    (Q(status='todo') | Q(status='in_progress')) &
    (Q(priority=3) | Q(due_date__lt=today))
)

Динамическое построение фильтра

def search_tasks(query=None, status=None, user=None):
    q = Q()
    if query:
        q &= Q(title__icontains=query) | Q(description__icontains=query)
    if status:
        q &= Q(status=status)
    if user:
        q &= Q(owner=user)
    return Task.objects.filter(q)

В annotate

from django.db.models import Count, Q

Project.objects.annotate(
    done_count=Count('tasks', filter=Q(tasks__status='done')),
    todo_count=Count('tasks', filter=Q(tasks__status='todo')),
)

Сравнение двух полей

# Задачи где updated_at > created_at (т.е. обновлялись)
from django.db.models import F
Task.objects.filter(updated_at__gt=F('created_at'))

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

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

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Class-Based Views в Django

CBV — классы вместо функций. Встроенные CBV реализуют типовые паттерны CRUD.

📅 30.06.2026 👁️ 278
📝

Поиск в Django

Поиск в Django можно начать с простых ORM-фильтров, а для ранжирования и полнотекстового поиска использовать...

📅 30.06.2026 👁️ 279
📝

Swagger документация с drf-spectacular

drf-spectacular генерирует OpenAPI 3.0 схему и Swagger UI для DRF.

📅 30.06.2026 👁️ 565
🎓 Продолжить обучение

В каких курсах используется этот материал

Перейдите к курсу, чтобы закрепить материал на практике.

Django RequestLab: от HTTP до безопасного продакшена Открыть программу курса