看例子
from pydantic import BaseModel
class A(BaseModel):
a: float = 0.0
class B(A):
b: float = 0.0
class C(A):
c: float = 0.0
b = B(a=1.1, b=2.2)
b_json = b.model_dump_json()
所以我有两个类 B,C,它们有一个父级 A。这里创建了 B 实例的 json,然后转到数据库等中的某个位置。当我在其他时间(从数据库等)获取此 json 时,我需要猜测是什么类它是正确解析和反序列化的
B.parse_raw(b_json) # instead C.parse_raw(b_json)
是否有一些好的实践可以实现这一目标?也许保留一些额外的信息?或者 JSON 序列化/pydantic 不太适合此类目的?
我想说你不应该猜测你从数据库中获取了什么样的数据。您应该通过定义仅获取
A data
或 B data
的方法来使其更加明确。例如:
# Models that reflect db schema
@as_declarative(metadata=MetaData(naming_convention=NAMING_CONVENTION))
class BaseOrmModel:
"""Baseclass for custom models."""
@declared_attr
def __tablename__(cls) -> Any:
"""Declared attribute for building db table name."""
return ...
class BModel(BaseOrmModel):
b = sa.Column(sa.Float, nullable=False)
class CModel(BaseOrmModel):
c = sa.Column(sa.Float, nullable=False)
# Repository responsible for db queries
class Repository:
def get_b(self) -> BModel:
return select(...)
def get_c(self): -> CModel:
return select(...)
# Schemas
class A(BaseModel):
model_config = ConfigDict(from_attributes=True)
a: float = 0.0
class B(A):
b: float = 0.0
class C(A):
c: float = 0.0
# Usage example
repository = Repository()
c_model = repository.get_c()
c_schema = C.model_validate(c_model)
在上面的示例中,如果您使用
B
并且可以正确地将其映射到 get_b
模式,那么您确定会获得 B
对象。