Связь book_id=created_book.id корректна. temp не используется и должен быть удалён; создание книги и обложек нужно объединить транзакцией, а исходный словарь не мутировать.
Добавление книги вместе с её обложками
Связь book_id=created_book.id корректна. temp не используется и должен быть удалён; создание книги и обложек нужно объединить транзакцией, а исходный словарь не мутировать.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Проверьте работу функции create_book. Из входного словаря validate_data необходимо извлечь список обложек, создать запись модели Book, а затем для каждой обложки сформировать связанную запись модели BookCover.
def create_book(validate_data: dict):
cover_data: list[dict] = validate_data.pop('covers')
created_book = Book.objects.create(**validate_data)
temp = []
for cover_item in cover_data:
BookCover.objects.create(**cover_item, book_id=created_book.id)
Ответ
Связь book_id=created_book.id корректна. temp не используется и должен быть удалён; создание книги и обложек нужно объединить транзакцией, а исходный словарь не мутировать.
Каркас:
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 запрещены для клиента. При большом количестве обложек можно рассмотреть bulk_create, если не требуется индивидуальная логика save и сигналы. Транзакция не распространяется автоматически на внешнее файловое хранилище.