✅ Решения — Урок 36

← К оглавлению урока

⚡ Таблица ответов

ВопросОтвет
1a, b
2c
3d
4b
5b
6b
7d
8c
9b
10c
11b
12b
13c
14b
15d
16c
17a
18c
19c
20d
21a
22d

Блок 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 — тоже неверный путь.