Задать вопрос
weranda
@weranda

В каком слое DTO объект преобразовывать в словарь перед сохранением в БД?

Приветствую.

Имеем слои: роут, сервис, репо.
В роут приходят данные формы.
В роуте создается DTO-pydantic объект с данными формы.
Из роута DTO передается в сервис.
Из сервиса данные отправляются в репо.
В репо данные должны быть запиханы в модель для БД.

Вопрос: на каком этапе преобразовывать DTO в словарь для маппинга в модель? Какова, она, эта лучшая практика? И что важно — почему так, а не иначе?

DTO можно передать и в репо и обработать в нем. Так до «последнего» сохраняется конкретность/понятность в передаваемых данных. С другой стороны, нужно ли репо знать о DTO вообще? Можно, вообще, в сервисе запилить маппинг в модель, а модель передать в репо, но зачем сервису знать о моделях для сохранения в БД... в общем, недопонимание. Полезным практикам и опыту буду рад.
  • Вопрос задан
  • 156 просмотров
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
  • Skillfactory
    Профессия Python-разработчик
    9 месяцев
    Далее
  • SF Education
    Бэкенд-разработчик на Python
    3 месяца
    Далее
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Я бы отдавал в репозиторий DTOшки. Что там в словаре должно быть и как преобразовывать - это имхо как раз его вопрос, вышележащему коду это знать незачем.
Ответ написан
Комментировать
@constantinesx
Формировать в сервисном слое ORM модель и передавать ее в репо - плохая идея:
1. Часто приводится аргумент «а вот захочешь ты сменить реляционную БД на nosql и тогда сервисный слой придется переписывать». И хоть это и редкий кейс, тем не менее стоит держать его в голове. Избегайте протекание логики работы с БД в сервисный слой.
2. Само название DTO содержит цель этой сущности - гонять данные между функциями/слоями. Модель ORM это более сложный и более специфичный объект.

Насчет передачи словаря в репо из сервиса тоже есть сомнения:
1. DTO обеспечивает валидацию данных, автодополнение кода, типизацию и еще много что на самом деле - можно писать свои методы, реализующие необходимую логику. Словари - нет.
2. Если вы уже описали DTO, то немного странно использовать его только для передачи данных из роута в сервис. Почему бы тогда не использовать его и для передачи из сервиса в репо?

Резюмируя - передавайте данные между слоями в DTO, в обоих направлениях.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы