Создание записи книги вместе с обложками – вариант 1

book_id=new_book.id корректно связывает обложку с созданной книгой. Однако все записи нужно создавать в одной транзакции, а входной словарь копировать перед pop и проверять поля каждой обложки.

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

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

book_id=new_book.id корректно связывает обложку с созданной книгой. Однако все записи нужно создавать в одной транзакции, а входной словарь копировать перед pop и проверять поля каждой обложки.

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

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

Условие

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

def create_book(data: dict):
    cover_list: list[dict] = data.pop('covers')
    new_book = Book.objects.create(**data)
    for cover_item in cover_list:
        BookCover.objects.create(**cover_item, book_id=new_book.id)

Ответ

book_id=new_book.id корректно связывает обложку с созданной книгой. Однако все записи нужно создавать в одной транзакции, а входной словарь копировать перед pop и проверять поля каждой обложки.

Если одна обложка не сохранится, предыдущие записи без транзакции останутся в БД. Исправленный каркас:

from django.db import transaction

def create_book(data):
    fields = dict(data)
    covers = fields.pop('covers', [])
    with transaction.atomic():
        book = Book.objects.create(**fields)
        for cover in covers:
            BookCover.objects.create(**cover, book_id=book.pk)
    return book

В cover не должно быть book/book_id: эти поля задаёт сервер. Синтаксис именованного аргумента после **cover допустим; проблема возникает при дублирующемся ключе. Файловые операции требуют отдельной обработки отката.

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

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

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

Подробнее