Реализация добавления книги с набором обложек в Django

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

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

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

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

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

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

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

Подробнее