Не изменяйте входной data, проверяйте обложки заранее и создавайте книгу со связанными записями в одной transaction.atomic.
Регистрация книги вместе с её обложками через API
Не изменяйте входной data, проверяйте обложки заранее и создавайте книгу со связанными записями в одной transaction.atomic.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
При получении POST‑запроса, отвечающего за создание новой книги, вызывается функция create_book. Она формирует запись модели Book, а затем создает связанные записи модели BookCover. Необходимо выполнить ревью кода: оценить корректность и надёжность процесса создания сущностей, обратить внимание на возможные проблемы с транзакционностью и оптимизацией.
def create_book(data: dict):
cover_list: list[dict] = data.pop('covers')
new_book = Book.objects.create(**data)
for cover in cover_list:
BookCover.objects.create(**cover, book_id=new_book.id)
Ответ
Не изменяйте входной data, проверяйте обложки заранее и создавайте книгу со связанными записями в одной transaction.atomic.
from django.db import transaction
@transaction.atomic
def create_book(data):
payload = dict(data)
covers = payload.pop('covers', [])
book = Book.objects.create(**payload)
BookCover.objects.bulk_create([
BookCover(book=book, **cover) for cover in covers
])
return book
Это пример после валидации разрешённых полей: клиент не должен передавать свой book или book_id внутри обложек. При ошибке вставки обложек транзакция откатит и книгу. bulk_create уменьшает число запросов, но не вызывает обычные save и сигналы для каждой записи. Если они необходимы, оставьте цикл внутри транзакции. Внешние файлы и сообщения требуют отдельной координации: откат БД их не отменяет.