如何为嵌套字典定义 Pydantic Class

How to define Pydantic Class for nested dictionary

我们如何为以下嵌套字典结构(以复杂的字符串作为键)定义 Pydantic Class 类型:

{ "inputs" : {
        "simpleStringName": <Simple_DateTime_Value>
        "simpleStringName2": {
        "Complicated|String|Name|with|Pipe|Characters" : <Simple-Int-Value>,
        "Complicated|String|Name2|with|Pipe|Characters" : <Simple-Int-Value2>
        }
    }
}

Pydantic 需要加强整个结构。那就是这行不通:

class XYZ(BaseModel):
    inputs : Dict()

我想使用 Pydantic 和 fastAPI 强制执行请求输入格式。

这可能就是您想要的

import datetime
from typing import Union, Dict
from pydantic import BaseModel

class XYZ(BaseModel):
    inputs: Dict[str, Union[datetime.datetime, Dict[str, int]]]
>>> XYZ(**{
...     "inputs" : {
...         "simpleStringName": datetime.datetime.utcnow(),
...         "simpleStringName2": {
...             "Complicated|String|Name|with|Pipe|Characters" : 3,
...             "Complicated|String|Name2|with|Pipe|Characters" : 4
...         }
...     }
... })
XYZ(inputs={'simpleStringName': datetime.datetime(2021, 11, 11, 16, 34, 21, 906156), 'simpleStringName2': {'Complicated|String|Name|with|Pipe|Characters': 3, 'Complicated|String|Name2|with|Pipe|Characters': 4}})

如果您想显式定义字符串,可以使用 Pydantic 的约束类型(此处 constr 带有正则表达式,但有许多选项可用)
https://pydantic-docs.helpmanual.io/usage/types/#constrained-types

class XYZ(pydantic.BaseModel):
    inputs: Dict[
        pydantic.constr(regex="^[a-zA-Z\d]+$"),
        Union[
            datetime.datetime,
            Dict[
                pydantic.constr(regex="^[a-zA-Z\d\|]+$"),
                int
            ]
        ]
    ]