问题如下:
我们有具有以下结构的 JSON:
{
key1: [
{
type_x: str,
atr1: str,
atr2: int
},
{
type_x: str,
atr1: str
},
{
type_x: str,
atr1: str,
atr2: int,
atr3: int
},
],
key2: [
{
atr1: str,
atr2: int
}
]
}
我需要创建一个用于验证的模型,但是对于键 key1 的字典列表的不同元素,我需要根据 type_x 键的值应用不同的验证。如您所见,列表元素中的参数数量不同,比方说,所需的参数取决于 type_x 参数的值。例如,如果值为type_x = 'base',则其模型为:
class MyBase(BaseClass):
type_x: str
atr1: str
atr2: int
如果值type_x = 'root':
class MyRoot(BaseClass):
type_x: str
atr1: str
atr3: int
我想出了如何为 key1 列表的每个元素编写相同的验证:
class MyClass(BaseClass):
type_x: str
atr1: str
atr2: int
但是如何根据type_x的值做出不同的必填参数呢?当然,理想情况下,这应该在一个通用模型的框架内完成,以免为每个版本的 type_x 值生成单独的模型。谢谢你。
要针对多个字段进行验证,请使用root_validator:
更新。如果 JSON 中可能不存在某个字段,则“包装”其类型
Optional(即字面意思是“可选”),缺失的字段将被初始化为None:结论:
最重要的是,您已经可以根据
type_x答案的第一部分所示的相同方式根据值来加快对正在填写的字段的验证(如果必须填写该字段,请检查它是否为is not None)。如果稍后您需要转换为 JSON,并且希望“空”字段不进入 JSON,请使用参数转换为 json
exclude_unset=True:通过单独的类实现,具体类型由其中一个字段的值决定。这在 Pydantic 文档中称为区分联合(又名标记联合) 。
结论: