Переменная objs сейчас не используется. Либо удалите её, сохранив цикл внутри транзакции, либо заполните экземплярами BookCover и вызовите bulk_create. Входные данные лучше не изменять через pop.
Создание книги и её обложек
Переменная objs сейчас не используется. Либо удалите её, сохранив цикл внутри транзакции, либо заполните экземплярами BookCover и вызовите bulk_create. Входные данные лучше не изменять через pop.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Функция create_book отвечает за создание записи модели Book и связанных с ней записей модели BookCover. Список обложек передаётся в параметре validate_data под ключом covers. Требуется выполнить код‑ревью: убедиться, что логика реализована корректно, нет ли потенциальных проблем с производительностью или атомарностью операции. Нужно проверить, правильно ли создаются обложки, обоснована ли необходимость переменной objs, имеет ли смысл использовать 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)
Ответ
Переменная objs сейчас не используется. Либо удалите её, сохранив цикл внутри транзакции, либо заполните экземплярами BookCover и вызовите bulk_create. Входные данные лучше не изменять через pop.
Вариант пакетного создания после валидации:
from django.db import transaction
def create_book(validate_data):
fields = dict(validate_data)
covers = fields.pop('covers', [])
with transaction.atomic():
book = Book.objects.create(**fields)
BookCover.objects.bulk_create([
BookCover(book=book, **cover) for cover in covers
])
return book
В cover запретите book/book_id. bulk_create не вызывает обычные save и сигналы, поэтому подходит не всегда; для большого списка задают batch_size. Транзакция откатывает изменения БД, но не загрузки файлов во внешнее хранилище.