簡體   English   中英

抽象的抽象子類 class

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM