如何为嵌套字典定义 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
]
]
]
我们如何为以下嵌套字典结构(以复杂的字符串作为键)定义 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
]
]
]