Урок 36. Основы Django REST Framework: часть 4
⚡ Кратко: 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 JOINprefetch_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), декораторы
🎯 Что изучать дальше
- → Урок 37: Практикум 8 — применение soft deletion и транзакций
- Пагинация:
pagination_class,PageNumberPagination - Аутентификация: JWT, SessionAuthentication, TokenAuthentication
- django-guardian — object-level permissions с поддержкой soft deletion
- celery +
transaction.on_commit— фоновые задачи после коммита