Добавление книги с набором обложек (вариант 3)

Создавайте книгу и обложки атомарно, не меняйте validate_data и либо используйте objs для bulk_create, либо удалите эту переменную.

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

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

Создавайте книгу и обложки атомарно, не меняйте validate_data и либо используйте objs для bulk_create, либо удалите эту переменную.

Подробный разбор

Ответ с пояснениями

Условие

Функция create_book отвечает за создание записи модели Book и связанных с ней записей модели BookCover. Список обложек передаётся в словаре validate_data под ключом covers. Необходимо провести ревью кода: убедиться, что логика реализована корректно, нет ли потенциальных проблем с производительностью или атомарностью операций. Проверить, правильно ли формируются объекты обложек, имеет ли смысл использовать переменную objs, стоит ли заменить отдельные вызовы create на bulk_create, а также нужны ли дополнительные проверки или обёртка в транзакцию.

def create_book(validate_data: dict):
    covers: list[dict] = validate_data.pop('covers')
    book = Book.objects.create(**validate_data)
    objs = []
    for cover in covers:
        BookCover.objects.create(**cover, book=book)

Ответ

Создавайте книгу и обложки атомарно, не меняйте validate_data и либо используйте objs для bulk_create, либо удалите эту переменную.

from django.db import transaction

@transaction.atomic
def create_book(validate_data):
    payload = dict(validate_data)
    covers = payload.pop('covers', [])
    book = Book.objects.create(**payload)
    objects = [BookCover(book=book, **cover) for cover in covers]
    BookCover.objects.bulk_create(objects)
    return book

Перед этим проверьте схему обложек и запретите передачу клиентом поля book. При обязательных обложках отсутствие ключа должно быть ошибкой валидации. bulk_create подходит только если не нужны индивидуальные save и сигналы. Внешние файлы транзакция БД не откатывает: загрузку и уборку неиспользуемых файлов координируют отдельно. Исходная переменная objs=[] действительно не влияет на результат.

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

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

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

Подробнее