Может ли Pydantic model_dump() вернуть точный тип?Python

Программы на Python
Ответить
Anonymous
 Может ли Pydantic model_dump() вернуть точный тип?

Сообщение Anonymous »

Я нашел 0 других людей, которые задают этот вопрос, поэтому мне просто нужно спросить:
Вопрос: Как я могу получить типизированный «дамп» из модели Pydantic?
Мой контекст:
У нас есть .model_dump(), но его подсказка типа возвращаемого значения — dict[str, Any]. Это раздражает, потому что я хочу написать серверную часть FastAPI с моделями SQLAlchemy ORM и Pydantic. При создании модели ORM у нас есть только один вариант (я думаю) создать экземпляр — вызвать конструктор с помощью kwargs. Допустим, User — это модель SQLAlchemy (декларативная база), мы создаем такую:

Код: Выделить всё

User(name="John")
С помощью модели UserCreate в Pydantic мы могли бы передать ее как

Код: Выделить всё

user = UserCreate(name="John")
User(**user.model_dump())
Теперь мы не можем получить статическую проверку типов, чтобы убедиться, что наши поля Pydantic UserCreate соответствуют модели пользователя SQLAlchemy.
Итак, если я добавлю новое поле в мою модель SQLAlchemy, например:

Код: Выделить всё

from sqlalchemy.orm import MappedAsDataclass, DeclarativeBase

class BaseDBModel(MappedAsDataclass, DeclarativeBase):
pass

class User(BaseDBModel):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True, init=False)
name: Mapped[str] = mapped_column()
age: Mapped[int] = mapped_column()
и моя PydanticModel

Код: Выделить всё

from pydantic import BaseModel

class UserCreate(BaseModel):
name: str
Средство проверки статического типа не может определить, что в dict user.model_dump() отсутствует возраст.

Код: Выделить всё

user = UserCreate(name="John")
User(**user.model_dump())
поэтому ошибки времени выполнения позволяют понять, что вы забыли возраст в UserCreate. Я знаю, что у Тианголо (создателя FastAPI) есть своя собственная ORM (SQLModel), которая могла бы это исправить, но она слишком молода для внедрения.
SQLAlchemy версии 2.0.23
Pydantic версии 2.5
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»