book_id=book.id правильно привязывает обложку к созданной книге. Нужно исключить дублирующее поле связи в cover, не мутировать validate_data и объединить создание всех записей транзакцией.
Реализация создания книги вместе с её обложками
book_id=book.id правильно привязывает обложку к созданной книге. Нужно исключить дублирующее поле связи в cover, не мутировать validate_data и объединить создание всех записей транзакцией.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо убедиться, что процесс создания записи Book работает корректно, а затем автоматически создаются связанные записи BookCover, используя информацию из списка covers. Важно проверить, что при формировании обложек в поле book_id передаётся идентификатор только что созданной книги.
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)
Ответ
book_id=book.id правильно привязывает обложку к созданной книге. Нужно исключить дублирующее поле связи в cover, не мутировать validate_data и объединить создание всех записей транзакцией.
Пример после валидации:
from django.db import transaction
def create_book(validate_data):
fields = dict(validate_data)
covers = fields.pop('covers', [])
with transaction.atomic():
book = Book.objects.create(**fields)
for cover in covers:
BookCover.objects.create(book_id=book.pk, **cover)
return book
Связь book/book_id клиенту внутри cover задавать нельзя. При ошибке одной записи транзакция откатит записи БД, но не внешние файловые операции. Если covers обязательно по контракту, отсутствие ключа лучше отклонить при валидации, а не молча заменять пустым списком.