Добавление книги вместе с её обложками

Связь book_id=created_book.id корректна. temp не используется и должен быть удалён; создание книги и обложек нужно объединить транзакцией, а исходный словарь не мутировать.

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

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

Связь book_id=created_book.id корректна. temp не используется и должен быть удалён; создание книги и обложек нужно объединить транзакцией, а исходный словарь не мутировать.

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

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

Условие

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

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

Ответ

Связь book_id=created_book.id корректна. temp не используется и должен быть удалён; создание книги и обложек нужно объединить транзакцией, а исходный словарь не мутировать.

Каркас:

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 запрещены для клиента. При большом количестве обложек можно рассмотреть bulk_create, если не требуется индивидуальная логика save и сигналы. Транзакция не распространяется автоматически на внешнее файловое хранилище.

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

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

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

Подробнее