Синтаксис исходной функции допустим, но она мутирует вход, не возвращает книгу и не гарантирует атомарное создание обложек. Ошибка в середине цикла оставит часть записей без внешней транзакции.
Формирование записи книги с прикреплёнными обложками – вариант 4
Синтаксис исходной функции допустим, но она мутирует вход, не возвращает книгу и не гарантирует атомарное создание обложек. Ошибка в середине цикла оставит часть записей без внешней транзакции.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Функция create_book отвечает за создание экземпляра модели Book и связанных с ней записей BookCover на основе переданного словаря validate_data. Сначала из словаря извлекается список данных об обложках, затем создаётся объект книги, после чего в цикле последовательно создаются объекты обложек, привязывая их к только что созданной книге. Необходимо выполнить ревью кода: проверить корректность синтаксиса, правильность передачи связанных данных, возможности оптимизации и потенциальные ошибки.
def create_book(validate_data: dict):
covers: list[dict] = validate_data.pop('covers')
book = Book.objects.create(**validate_data)
for cover in covers:
BookCover.objects.create(**cover, book_id=book.id)
Ответ
Синтаксис исходной функции допустим, но она мутирует вход, не возвращает книгу и не гарантирует атомарное создание обложек. Ошибка в середине цикла оставит часть записей без внешней транзакции.
Исправьте контракт: копия validated_data, явно обязательный или необязательный covers, валидация вложенных полей, transaction.atomic() и return book. Если cover содержит book_id, вызов с дополнительным book_id даст конфликт аргументов; поле связи должно задаваться сервером. Для множества обложек рассмотрите bulk_create, учитывая отсутствие вызова save() и сигналов. Если создание затрагивает файлы, нужна отдельная стратегия компенсации или завершения после commit.