从similar question开始,我们的目标是创建一个类似于以下Typescript界面的模型:
interface ExpandedModel {
fixed: number;
[key: string]: OtherModel;
}
但是,OtherModel需要验证,因此只需使用:
class ExpandedModel(BaseModel):
fixed: int
class Config:
extra = "allow"
还不够。我试过root(pydantic docs):
class VariableKeysModel(BaseModel):
__root__: Dict[str, OtherModel]
但是做一些像这样的事情:
class ExpandedModel(VariableKeysModel):
fixed: int
不可能,原因如下:
ValueError:root不能与其他字段混合@root_validator
(example from another answer)之类的东西在这种情况下有用吗?
1条答案
按热度按时间qncylg1j1#
谢天谢地,Python不是TypeScript,正如注解here中提到的,对象通常不是字典,动态属性在几乎所有情况下都被认为是错误的形式。
当然,您仍然可以动态地设置属性,但是它们将永远不会被静态类型检查器(如Mypy或IDE)识别。这意味着您将不会获得这些动态字段的自动建议。只有在类的命名空间中静态定义的属性才被视为该类的成员。
也就是说,您可以滥用
extra
配置选项,允许将任意字段动态添加到模型中,同时通过root_validator
将所有对应的值强制为特定类型。演示:
输出:
一个一个二个一个一个一个三个一个一个一个一个一个四个一个
IMO的一个 * 更好 * 的方法是将动态的名称-对象对放入字典中,例如,您可以在
Bar
模型上定义一个单独的字段foos: dict[str, Foo]
,并通过这种方式获得自动验证。或者,您可以针对特定情况完全抛弃外部基础模型,而将数据作为具有
Foo
值的原生字典来处理,并通过Foo
模型解析所有这些值。