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