我正在尝试将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
答案 0 :(得分:1)
目前最好的方法是使用Union
,类似
class Response(BaseModel):
events: List[Union[Child2, Child1, Base]]
请注意联盟中的顺序很重要:pydantic会将您的输入数据与Child2
,然后依次为Child1
和Base
进行匹配;因此,您上面的事件数据应正确验证。参见this warning about Union
order。
将来discriminators可能能够以更强大的方式执行类似的操作。
this issue中还提供了有关相关事项的更多信息。