在BaseModel中传递int类型的字符串



我正在尝试使用BaseModel进行数据验证的POST方法构建fastAPI。我的(简化)输入数据是一个JSON,看起来像:

{   
"name": "test",
"a": {
"b": {
"c": {
"0": "Fl"
},
"400": {
"0": 0
}
},
"d": {
"400": {
"0": 56.3,
"1": 78.3,
"2": 96.1,
"3": 101.58
}
}
}
}

当我尝试创建我的BaseModel时,PyCharm告诉我给出400,str(400)或'400'作为键是错误的。因此,我将有一个类,看起来像:

class D_0123(BaseModel):
0: float
1: float
2: float
3: float
class BD(BaseModel):
400: Dict[D_0123]
class Item(BaseModel):
name: str
a: Dict[BD]

PyCharm给了我一个错误:'变量分配的非法目标'。我知道JSON不能将int作为键,而是将它们自动转换为"int"

所以我想知道我想做的是可能的吗?有解决办法吗?

感谢大家的宝贵时间!

祝你有美好的一天!

pydantic(以及FastAPI)利用的Python语法是:

class SomeName:
attribute_name: type

BaseModel超类可能有一个自定义元类(或自定义__init_subclass__方法),读取类属性及其相关类型的名称。attribute_name必须遵循Python的标识符语义,所以它必须以字母开头,以字母数字+下划线结尾。

因此,我认为通常情况下¹您不能利用"自动"验证,使用不可接受的键作为标识符,您必须用自己的代码验证字段内容。
或者您可以更改约定,如果pydantic不忽略带下划线前缀的类成员,则由数字组成的任何键都以下划线开头。

¹我说"通常"是因为你可以替换:

class D_0123(BaseModel):
0: float
1: float
2: float
3: float

:

D_0123 = type('D_0123', (BaseModel,), {"0": None, "1": None, "2": None, "3": None})
D_0123.__annotations__ = {"0": float, "1": float, "2": float, "3": float}

但我非常怀疑它是否会像你期望的那样起作用;这取决于BaseModel的定义以及在子类(即D_0123)创建期间完成了多少处理。

PS参见FastAPI文档中的任意字典体。

相关内容

最新更新