Регистрация книги вместе с её обложками через API

Не изменяйте входной data, проверяйте обложки заранее и создавайте книгу со связанными записями в одной transaction.atomic.

Короткий ответ

Что ответить на собеседовании

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

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

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

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

Подробнее