Синтаксис допустим, но 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()/сигналы. Откат БД не удаляет автоматически файлы, уже отправленные в файловое хранилище.