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

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

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

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

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

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

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

Условие

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

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

Ответ

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

Пример после валидации:

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

Связь book/book_id клиенту внутри cover задавать нельзя. При ошибке одной записи транзакция откатит записи БД, но не внешние файловые операции. Если covers обязательно по контракту, отсутствие ключа лучше отклонить при валидации, а не молча заменять пустым списком.

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

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

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

Подробнее