pydantic和抽象类的子类

时间:2019-10-09 09:45:14

标签: python 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>]

它只占用了基类的字段,而忽略了其余的字段。如何将pydantic与此类继承结合使用?我希望事件是Base

子类实例的列表。

1 个答案:

答案 0 :(得分:1)

目前最好的方法是使用Union,类似

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

请注意联盟中的顺序很重要:pydantic会将您的输入数据与Child2,然后依次为Child1Base进行匹配;因此,您上面的事件数据应正确验证。参见this warning about Union order

将来discriminators可能能够以更强大的方式执行类似的操作。

this issue中还提供了有关相关事项的更多信息。