new_operation уже проверена ранее пайдентиком
Пидантик не описывает модели бд, соответственно .дикт вернёт хз что, не имеющее отношение к модели. Каждое изменение будет приводить к проблемам
но это ведь как раз та проблема, из-за которой Тианголо делал SQLModel — что в схемах пидантика приходится дублировать модели алхимии и здесь корректность задается именно этим — что мы в схеме фактически продублировали то что в модели
в примере из видео — мы видим что схема полностью дублирует модель class OperationCreate(BaseModel): id: int quantity: str figi: str instrument_type: str date: datetime type: str operation = Table( "operation", metadata, Column("id", Integer, primary_key=True), Column("quantity", String), Column("figi", String), Column("instrument_type", String, nullable=True), Column("date", TIMESTAMP), Column("type", String), )
как понял такое дублирование стандартная вещь для ФастАпи. или можно сделать лучше? какой способ был бы лучше для данного примера?
То что схема дублирует модель - частный случай. Как правило могут быть вычислимые поля в схеме или какие-то поля которые необходимо скрыть
но всё же основное их назначение — валидировать корректный ввод, в данном случае соответствующий модели БД. поэтому не оч понимаю придирку Тишки (и как можно сделать красивее)
если необходимо скрыть вроде это можно сделать в опциях метода, возвращающего дикт
Это НЕ дублирование. Они разные
Это как раз та проблема, которая усугубляется использованием sqlmodel. Две разные модели, описывающие разные штуки объединяют и заставляют быть одинаковыми
Но конкретно здесь — схема OperationCreate создается именно такой чтобы корректно описывать инфу нужную для добавления операции. За счет верного описания можно передавать ее dict() инсерту. И мне показалось по доке что это стандартный подход для Фастапи Как делаешь ты вместо этого, мб можно увидеть пример в каком-то репозитории?
Стандартный подход в доке фастапи - хуячить говнокод
OperationCreate в какой-то момент может совпадать с моделью бд по набор полей, но не обязана. И не будет совпадать всю жизнь приложения. Например, у меня часто запрос юзера приводит к созданию нескольких моделей бд. Юзер апи просто не знает что какие-то штуки в бд хранятся нормализованно. В других случаях ты можешь захотеть сохранить апи меняя структуру бд. Банально, какие-то поля могут начать игнорироваться или влиять на генерацию чего-то
Но какой подход будет верным — вручную доставать по одному полю из схемы и передавать в инсерт по именам?
Почему не юзать ORM?
Да, передавать по одному явным образом. Чтобы когда будешь искать какие юзаются, ты сразу нашел
Можно какой-то пример? В данном случае есть ORM модель operation, как ее юзать по полученной в запросе схеме OperationCreate?
Или в каком смысле юзать ORM? Что-то запутался..
Model(name=schema.title, field=(1 if schema.flag else 100),...)
Обсуждают сегодня