【问题标题】:How do I define a nested Pydantic model with a Tuple containing Optional models?如何使用包含可选模型的元组定义嵌套的 Pydantic 模型?
【发布时间】:2021-05-12 18:17:21
【问题描述】:

我目前正在使用以下嵌套模型 (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 对我来说不是一个选项,因为我预计未来模型的数量会增加,并且可能的组合也会增加。

【问题讨论】:

    标签: python fastapi pydantic


    【解决方案1】:

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

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

    【讨论】:

    • 也可以。我最终使用了元组本身。正如 Eric Jolibois 在 github 上所建议的那样,Tuple[Union[Model1, Model2],...]
    【解决方案2】:

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

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

    在使用Union时还需要牢记that

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

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

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

    class Model1(BaseModel):
        count: int
    
        class Config:
            extra = "forbid"
    

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 2021-09-11
      • 1970-01-01
      • 2021-09-06
      • 2022-07-28
      • 1970-01-01
      • 2021-03-04
      • 2021-09-16
      相关资源
      最近更新 更多