我目前正在使用以下嵌套模型 (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 不适合我,因为我预计未来模型数量会增加,并且可能的组合也会增加。
答案 0 :(得分:1)
您确定要使用元组吗?元组本质上是固定大小的,在您的 Pydantic 模型中使用它需要两个元素都存在。
相反,您可以使用 List[Union[Model1, Model2]]
答案 1 :(得分:1)
要指定多种类型的可变长度元组,您可以使用省略号文字 ...
和 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"