Урок 36. Основы Django REST Framework: часть 4

📁 Блок: DRF ⏱️ Время изучения: ~75 мин 🎯 Сложность: Средняя
#soft-deletion #manager #lazy-loading #select-related #prefetch-related #transactions #atomic

⚡ Кратко: DRF часть 4

Урок охватывает три продвинутые темы Django ORM и DRF: мягкое удаление (soft deletion) через поле is_deleted и кастомный менеджер; ленивая загрузка QuerySet и оптимизация через select_related/prefetch_related; транзакции через transaction.atomic, on_commit и set_rollback.

  • Soft deletion: поле is_deleted + переопределить delete() + кастомный менеджер SoftDeleteManager
  • Lazy loading: QuerySet не выполняется до обращения к данным — проблема N+1
  • select_related: JOIN для ForeignKey/OneToOne — 1 запрос вместо N
  • prefetch_related: отдельный запрос для ManyToMany/обратных FK — 2 запроса
  • transaction.atomic: декоратор или контекстный менеджер для атомарности
  • transaction.on_commit: выполнить код только после успешного коммита

Топ-3 ошибки: 1) Не переопределить менеджер — удалённые записи попадают в API. 2) Забыть select_related — N+1 запросов на продакшне. 3) Применить @transaction.atomic и @api_view в неправильном порядке.

📖 О чём этот урок

Урок 36 завершает блок теоретических занятий по Django REST Framework. Три темы урока объединяет общий контекст: как делать Django-приложения надёжными, производительными и целостными на уровне данных.

Мягкое удаление — паттерн, при котором записи не удаляются физически: вместо DELETE FROM устанавливается флаг is_deleted=True. Данные остаются для аудита и восстановления. Ленивая загрузка — особенность Django ORM: запросы не выполняются до реального обращения к данным, что требует оптимизации через select_related и prefetch_related. Транзакции обеспечивают атомарность связанных операций: либо всё выполняется успешно, либо всё откатывается.

Что изучим

  • Поля is_deleted / deleted_at для мягкого удаления
  • Переопределение метода delete() модели
  • Кастомный менеджер SoftDeleteManager для фильтрации удалённых записей
  • Принцип ленивой загрузки QuerySet и проблема N+1
  • select_related() — оптимизация ForeignKey через SQL JOIN
  • prefetch_related() — оптимизация ManyToMany через отдельные запросы
  • Принципы ACID транзакций
  • @transaction.atomic и with transaction.atomic()
  • transaction.on_commit(), transaction.set_rollback()
  • Ручное управление транзакциями через set_autocommit

📚 Что повторить перед изучением

  • ← Урок 35: Agile мини-проект часть 3
  • Модели Django: поля BooleanField, DateTimeField, ForeignKey, ManyToManyField (уроки 15, 17)
  • Django ORM: QuerySet, методы all(), filter(), get() (урок 19)
  • DRF: ModelViewSet, @action, Router (урок 33)
  • Python: менеджеры контекста (with), декораторы

🎯 Что изучать дальше