Может ли 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

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