是否可以在 pydantic 中使用任意键名?
Is it possible to have arbitrary key names in pydantic?
我正在尝试使用 pydantic
模型的任意键名模拟与 typescripts 接口类似的行为,但 运行 遇到了一些问题。
考虑 TS 中的以下内容:
export interface SNSMessageAttributes {
[name: string]: SNSMessageAttribute;
}
有可能在 pydantic 中实现吗?
这是我的 python 示例代码:
from pydantic import BaseModel, parse_obj_as
from typing import Optional
class Values(BaseModel):
Value: str
Type: str
class MessageAttributes(BaseModel):
ArbitraryKey: Optional[Values]
class Mymodel(BaseModel):
MessageAttributes: Optional[MessageAttributes]
data = {"MessageAttributes": {"ArbitraryKey": {"Type": "String", "Value": "TestString"}}}
parsed = parse_obj_as(Mymodel, data)
print(parsed.MessageAttributes.ArbitraryKey.Value)
# TestString
在此示例中,属性 ArbitraryKey
可以是任何内容。但我不可能对所有可能的键名进行硬编码。例如,如果键名不是 ArbitraryKey
,会怎样?
我知道我可以在 Config
中使用 extra = 'allow
,但这不会给出我在使用 parse_obj_as
时可以获得的点语法
我的问题是,如果可能的话,我可以在 pydantic 中为 属性 个名称做类似于 [name: string]
的事情吗?
经过讨论 Github,这正是我所希望的。
from pydantic import BaseModel, parse_obj_as
from typing import Dict, Optional
from pydantic import parse
class Values(BaseModel):
Value: str
Type: str
class Mymodel(BaseModel):
MessageAttributes: Optional[Dict[str, Values]]
data = {"MessageAttributes": {"ArbitraryKey": {"Type": "String", "Value": "TestString"}}}
parsed = Mymodel.parse_obj(data)
print(parsed)
print(parsed.MessageAttributes['ArbitraryKey'].Type)
我正在尝试使用 pydantic
模型的任意键名模拟与 typescripts 接口类似的行为,但 运行 遇到了一些问题。
考虑 TS 中的以下内容:
export interface SNSMessageAttributes {
[name: string]: SNSMessageAttribute;
}
有可能在 pydantic 中实现吗?
这是我的 python 示例代码:
from pydantic import BaseModel, parse_obj_as
from typing import Optional
class Values(BaseModel):
Value: str
Type: str
class MessageAttributes(BaseModel):
ArbitraryKey: Optional[Values]
class Mymodel(BaseModel):
MessageAttributes: Optional[MessageAttributes]
data = {"MessageAttributes": {"ArbitraryKey": {"Type": "String", "Value": "TestString"}}}
parsed = parse_obj_as(Mymodel, data)
print(parsed.MessageAttributes.ArbitraryKey.Value)
# TestString
在此示例中,属性 ArbitraryKey
可以是任何内容。但我不可能对所有可能的键名进行硬编码。例如,如果键名不是 ArbitraryKey
,会怎样?
我知道我可以在 Config
中使用 extra = 'allow
,但这不会给出我在使用 parse_obj_as
我的问题是,如果可能的话,我可以在 pydantic 中为 属性 个名称做类似于 [name: string]
的事情吗?
经过讨论 Github,这正是我所希望的。
from pydantic import BaseModel, parse_obj_as
from typing import Dict, Optional
from pydantic import parse
class Values(BaseModel):
Value: str
Type: str
class Mymodel(BaseModel):
MessageAttributes: Optional[Dict[str, Values]]
data = {"MessageAttributes": {"ArbitraryKey": {"Type": "String", "Value": "TestString"}}}
parsed = Mymodel.parse_obj(data)
print(parsed)
print(parsed.MessageAttributes['ArbitraryKey'].Type)