Функция меняет входной словарь и может оставить книгу без обложек при частичном сбое. Нужны валидация и единая транзакция.
Создание записи книги и её обложек в Django
Функция меняет входной словарь и может оставить книгу без обложек при частичном сбое. Нужны валидация и единая транзакция.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Проведите ревью функции, отвечающей за сохранение книги и связанных обложек в базе данных через Django ORM. Обратите внимание на корректность транзакционной обработки, проверку входных данных и возможности оптимизации запросов.
def create_book(data: dict):
cover_list: list[dict] = data.pop('covers')
new_book = Book.objects.create(**data)
for cov in cover_list:
BookCover.objects.create(**cov, book_id=new_book.id)
Ответ
Функция меняет входной словарь и может оставить книгу без обложек при частичном сбое. Нужны валидация и единая транзакция.
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_id=book.pk, **cover) for cover in covers
])
return book
Код предполагает уже проверенные поля, включая запрет клиентского book_id/book в обложках. Если обложки обязательны, отсутствие covers должно отклоняться валидатором, а не заменяться пустым списком. bulk_create не вызывает обычные save и модельные сигналы: при зависимости от них оставьте цикл. Транзакция защищает записи БД, но не операции с внешним файловым хранилищем.