book_id=new_book.id корректно связывает обложку с созданной книгой. Однако все записи нужно создавать в одной транзакции, а входной словарь копировать перед pop и проверять поля каждой обложки.
Создание записи книги вместе с обложками – вариант 1
book_id=new_book.id корректно связывает обложку с созданной книгой. Однако все записи нужно создавать в одной транзакции, а входной словарь копировать перед pop и проверять поля каждой обложки.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо убедиться, что процесс создания сущности Book корректно сопровождается созданием связанных записей BookCover на основе переданных данных об обложках. Проверьте, что при формировании каждой обложки правильно передаётся идентификатор книги.
def create_book(data: dict):
cover_list: list[dict] = data.pop('covers')
new_book = Book.objects.create(**data)
for cover_item in cover_list:
BookCover.objects.create(**cover_item, book_id=new_book.id)
Ответ
book_id=new_book.id корректно связывает обложку с созданной книгой. Однако все записи нужно создавать в одной транзакции, а входной словарь копировать перед pop и проверять поля каждой обложки.
Если одна обложка не сохранится, предыдущие записи без транзакции останутся в БД. Исправленный каркас:
from django.db import transaction
def create_book(data):
fields = dict(data)
covers = fields.pop('covers', [])
with transaction.atomic():
book = Book.objects.create(**fields)
for cover in covers:
BookCover.objects.create(**cover, book_id=book.pk)
return book
В cover не должно быть book/book_id: эти поля задаёт сервер. Синтаксис именованного аргумента после **cover допустим; проблема возникает при дублирующемся ключе. Файловые операции требуют отдельной обработки отката.