我如何定义一个嵌套Pydantic模型与Tuple包含可选模型?



我目前正在使用以下嵌套模型(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],
]]

我希望Tuple具有可变长度,因为我想根据需求传递Model1或Model2或两者。然而,元组似乎期望固定长度为2。

请注意,联合不是我的选择,因为我预计未来模型的数量会增加,可能的组合也会增加。

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

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

当使用Union时,还需要记住:

然而,正如上面所看到的,pydantic将尝试'匹配'Union下定义的任何类型,并将使用第一个匹配的类型。[…]

因此,建议在定义Union注释时,首先包含最具体的类型,然后是不太具体的类型.
因此,在您的示例中,Model2必须在Union中位于Model1之前,因为解析时Model2的对象将与Model1匹配,而其他成员将被丢弃。或者使用extra = forbid
class Model1(BaseModel):
count: int
class Config:
extra = "forbid"

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

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