Проверка метода создания книги с привязанными обложками

Нужны транзакция, копия входного словаря и возвращаемый book. Переменная objs сейчас не используется, а обложки создаются отдельными запросами.

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

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

Нужны транзакция, копия входного словаря и возвращаемый book. Переменная objs сейчас не используется, а обложки создаются отдельными запросами.

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

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

Условие

Необходимо убедиться в корректности функции create_book. Она принимает словарь validate_data, из которого извлекает список обложек, затем создаёт запись модели Book, после чего для каждой обложки формирует связанную запись BookCover, указывая идентификатор только что созданной книги.

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_id=book.id)

Ответ

Нужны транзакция, копия входного словаря и возвращаемый book. Переменная objs сейчас не используется, а обложки создаются отдельными запросами.

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)
    for cover in covers:
        BookCover.objects.create(**cover, book_id=book.pk)
    return book

Это вариант, сохраняющий вызовы save/сигналов для отдельных обложек. Если они не нужны, подготовьте объекты и используйте bulk_create. Входные поля должны быть заранее проверены, включая запрет подмены book_id внутри cover. При ошибке транзакция откатит книгу и все добавленные обложки. Наличие имени validate_data само по себе не доказывает, что валидация выполнена.

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

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

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

Подробнее