Создание записи книги и её обложек в 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 и модельные сигналы: при зависимости от них оставьте цикл. Транзакция защищает записи БД, но не операции с внешним файловым хранилищем.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее