首页 > 解决方案 > pydantic 和抽象类的子类

问题描述

我正在尝试将 pydantic 与如下所示的模式一起使用:

class Base(BaseModel, ABC):
    common: int

class Child1(Base):
    child1: int

class Child2(Base):
    child2: int

class Response(BaseModel):
    events: List[Base]


events = [{'common':1, 'child1': 10}, {'common': 2, 'child2': 20}]

resp = Response(events=events)

resp.events
#Out[49]: [<Base common=10>, <Base common=3>]

它只占用了 Base 类的字段,而忽略了其余部分。如何使用 pydantic 进行这种继承?我希望事件是子类的实例列表Base

标签: pythonpydantic

解决方案


现在最好的方法是使用Union,比如

class Response(BaseModel):
    events: List[Union[Child2, Child1, Base]]

注意 Union 中的顺序很重要:pydantic 会将您的输入数据与Child2, then Child1, then进行匹配Base;因此您的上述事件数据应该得到正确验证。请参阅有关Unionorder的警告。

在未来,鉴别器可能能够以更强大的方式做类似的事情。

本期还有更多相关事宜的信息。


推荐阅读