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

Синтаксис допустим, но pop меняет входные данные, ошибка обложки оставляет частичную книгу, а функция ничего не возвращает. Нужны копия входа, транзакция и валидация полей связи.

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

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

Синтаксис допустим, но pop меняет входные данные, ошибка обложки оставляет частичную книгу, а функция ничего не возвращает. Нужны копия входа, транзакция и валидация полей связи.

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

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

Условие

Функция create_book формирует запись книги и соответствующие ей обложки, используя данные из словаря data. Сначала из словаря извлекается список обложек, затем создаётся объект Book, после чего последовательно создаются объекты BookCover, привязывая их к только что созданной книге. Проведите ревью кода: проверьте синтаксис, правильность передачи связанных данных, возможности оптимизации и потенциальные ошибки.

def create_book(data: dict):
    cover_list: list[dict] = data.pop('covers')
    new_book = Book.objects.create(**data)
    for cover in cover_list:
        BookCover.objects.create(**cover, 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(book=book, **cover)
    return book

В cover запрещайте book и book_id, чтобы клиент не подменял связь и не создавал конфликт аргументов. Для большого списка возможен bulk_create, если не нужны индивидуальные save()/сигналы. Откат БД не удаляет автоматически файлы, уже отправленные в файловое хранилище.

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

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

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

Подробнее