Создавайте книгу и обложки атомарно, не меняйте validate_data и либо используйте objs для bulk_create, либо удалите эту переменную.
Добавление книги с набором обложек (вариант 3)
Создавайте книгу и обложки атомарно, не меняйте 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=[] действительно не влияет на результат.