✅ Решения — Урок 36
⚡ Таблица ответов
| Вопрос | Ответ |
|---|---|
| 1 | a, b |
| 2 | c |
| 3 | d |
| 4 | b |
| 5 | b |
| 6 | b |
| 7 | d |
| 8 | c |
| 9 | b |
| 10 | c |
| 11 | b |
| 12 | b |
| 13 | c |
| 14 | b |
| 15 | d |
| 16 | c |
| 17 | a |
| 18 | c |
| 19 | c |
| 20 | d |
| 21 | a |
| 22 | d |
Блок 1: Мягкое удаление
Вопрос 1 → Ответы: a) is_deleted и b) deleted_at
Оба поля являются стандартными для soft deletion. is_deleted: BooleanField — флаг удаления. deleted_at: DateTimeField — временная метка для аудита. Поля deleted_flag и removed — нестандартные названия, не принятые в Django-сообществе.
Вопрос 2 → Ответ: c) delete
Переопределяется стандартный метод delete() модели Django. Внутри вместо вызова super().delete() устанавливается self.is_deleted = True и вызывается self.save(). Методы save(), update() — не те точки расширения для soft deletion.
Вопрос 3 → Ответ: d) models.Manager
Кастомный менеджер наследуется от models.Manager и переопределяет get_queryset(). Классы QuerySetManager, SoftDeleteManager, DeleteManager не существуют как встроенные в Django — SoftDeleteManager — это имя, которое мы сами придумываем для своего класса.
Блок 2: Ленивая загрузка
Вопрос 4 → Ответ: b) DEBUG
Параметр DEBUG = True в settings.py включает отладочный режим Django. В этом режиме Django хранит все выполненные SQL-запросы в django.db.connection.queries. Также можно настроить логирование через LOGGING, но включение DEBUG — самый быстрый способ видеть SQL.
Вопрос 5 → Ответ: b
Ленивая загрузка означает задержку SQL-выполнения до момента реального обращения к данным. QuerySet создаётся «дёшево» — фактический SELECT происходит при итерации, срезе, list(), len() и т.д.
Вопрос 6 → Ответ: b) select_related
select_related() использует SQL JOIN для загрузки связанных объектов в одном запросе. Эффективен для ForeignKey и OneToOneField — «к одному» отношений, где JOIN оптимален.
Вопрос 7 → Ответ: d) prefetch_related
prefetch_related() делает отдельный SQL-запрос для связанных объектов и объединяет результаты на уровне Python. Подходит для ManyToManyField и обратных FK — «ко многим» отношений.
Вопрос 8 → Ответ: c) Будет выполнен фактический запрос к базе данных
Django QuerySet ленивый: SQL выполняется только при реальной оценке. Ошибки не возникает — Django просто выполняет запрос в момент обращения.
Вопрос 9 → Ответ: b) prefetch_related
ManyToManyField и обратные FK — это «ко многим» отношения, для которых JOIN не подходит (декартово произведение). prefetch_related() делает отдельный запрос с IN и связывает объекты в памяти.
Вопрос 10 → Ответ: c) FileHandler
logging.FileHandler — стандартный класс Python для записи логов в файл. Настраивается в блоке LOGGING['handlers'] в settings.py.
Вопрос 11 → Ответ: b) DEBUG
Django использует уровень DEBUG для логирования SQL-запросов через логгер django.db.backends. Уровень INFO не захватит SQL; WARNING и ERROR — только проблемы.
Блок 3: Транзакции
Вопрос 12 → Ответ: b) Атомарность
Атомарность (Atomicity) — первая буква «A» в ACID. Гарантирует принцип «всё или ничего»: либо все операции транзакции выполняются, либо ни одна.
Вопрос 13 → Ответ: c) @transaction.atomic
Правильный синтаксис — @transaction.atomic, где transaction — модуль django.db.transaction. Просто @atomic не работает без импорта; @db.atomic — несуществующий путь.
Вопрос 14 → Ответ: b) Откатывает текущую транзакцию
transaction.set_rollback(True) помечает текущую транзакцию для отката в конце блока atomic. Транзакция не откатывается немедленно — только при выходе из atomic блока.
Вопрос 15 → Ответ: d) transaction.on_commit()
Метод transaction.on_commit(fn) регистрирует callback, который вызывается после успешного COMMIT. Методов after_commit(), post_commit(), on_success() в Django не существует.
Вопрос 16 → Ответ: c) Когда требуется выделить конкретный блок кода
with transaction.atomic(): применяется для оборачивания конкретного блока кода. Это удобнее декоратора, когда транзакция нужна только для части функции.
Вопрос 17 → Ответ: a) transaction.set_autocommit(False)
Единственный существующий в Django метод для отключения автокоммита — transaction.set_autocommit(False). Методы enable_autocommit, disable_autocommit, stop_autocommit не существуют.
Вопрос 18 → Ответ: c) Транзакция будет откатана
При возникновении необработанного исключения внутри transaction.atomic() Django автоматически делает ROLLBACK. Это ключевое свойство атомарного блока.
Вопрос 19 → Ответ: c) transaction.commit()
Метод transaction.commit() явно фиксирует транзакцию — используется только при ручном управлении (set_autocommit(False)).
Вопрос 20 → Ответ: d) Долговечность
Долговечность (Durability) — «D» в ACID. Гарантирует, что после успешного COMMIT данные сохранены даже при сбоях питания, перезапусках и других отказах.
Вопрос 21 → Ответ: a) IntegrityError
django.db.IntegrityError выбрасывается при нарушении ограничений целостности БД: уникальность, внешние ключи, NOT NULL. Это стандартное исключение Django ORM.
Вопрос 22 → Ответ: d) django.db.transaction
Корректный импорт: from django.db import transaction. Модуля django.db.transactions (с «s») не существует; django.transaction — тоже неверный путь.