微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用包含可选模型的元组定义嵌套的 Pydantic 模型?

如何解决如何使用包含可选模型的元组定义嵌套的 Pydantic 模型?

我目前正在使用以下嵌套模型 (FinalModel):

class Model1(BaseModel):
    count: int

class Model2(BaseModel):
    method: str
    selector: dict
    count: int

class FinalModel(BaseModel):
    slow: bool
    models: Tuple[
        Optional[Model1],Optional[Model2],]]

我希望元组具有可变长度,因为我想根据要求传入 Model1 或 Model2 或两者。但是,元组似乎期望固定长度为 2。

请注意,Union 不适合我,因为我预计未来模型数量增加,并且可能的组合也会增加

解决方法

您确定要使用元组吗?元组本质上是固定大小的,在您的 Pydantic 模型中使用它需要两个元素都存在。

相反,您可以使用 List[Union[Model1,Model2]]

,

要指定多种类型的可变长度元组,您可以使用省略号文字 ...Union,如下所示:

class FinalModel(BaseModel):
    slow: bool
    models: Tuple[Union[Model2,Model1],...]

使用Union时还需要记住that

但是,如上所示,pydantic 将尝试“匹配”Union 下定义的任何类型,并将使用第一个匹配的类型。[...]

因此,建议在定义 Union 注释时,首先包含最具体的类型,然后是不太具体的类型

因此,对于您的示例,Model2 中的 Model1 必须位于 Union 之前,因为解析时 Model2 的对象将与 Model1 匹配,并且其他成员将被丢弃。或 use extra = forbid

class Model1(BaseModel):
    count: int

    class Config:
        extra = "forbid"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。