pydantic:如何知道哪个类被序列化为json

问题描述 投票:0回答:1

看例子

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 不太适合此类目的?

python serialization pydantic
1个回答
0
投票

我想说你不应该猜测你从数据库中获取了什么样的数据。您应该通过定义仅获取

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
对象。

© www.soinside.com 2019 - 2024. All rights reserved.