[英]pydantic and subclasses of abstract class
我正在嘗試將 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 class 的字段而忽略了 rest。我如何將 pydantic 與這種 inheritance 一起使用? 我希望事件成為Base
子類實例的列表
現在最好的方法是使用Union
,比如
class Response(BaseModel):
events: List[Union[Child2, Child1, Base]]
注意 Union 中的順序很重要:pydantic 會將您的輸入數據與Child2
匹配,然后是Child1
,然后是Base
; 因此您的上述事件數據應該得到正確驗證。 請參閱有關Union
order 的此警告。
在未來,鑒別器可能能夠以更強大的方式做類似的事情。
本期還有更多相關事宜的信息。
我着手通過構建自定義驗證器來解決這個問題:
class Base(BaseModel, ABC):
@classmethod
def __get_validators__(cls):
yield cls.validate
@classmethod
def validate(cls, v):
if not issubclass(v, Base):
raise ValueError("Invalid Object")
return v
common: int
class Child1(Base):
child1: int
class Child2(Base):
child2: int
class Response(BaseModel):
events: List[Base]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.