我试图将一个类中的一个字段限制为一个枚举。但是,当我尝试从类中获取字典时,它不会转换为字符串。相反,它保留枚举。我检查了 pydantic 文档,但找不到与我的问题相关的任何内容。
这段代码代表了我实际需要的东西。
from enum import Enum
from pydantic import BaseModel
class S(str, Enum):
am = 'am'
pm = 'pm'
class K(BaseModel):
k: S
z: str
a = K(k='am', z='rrrr')
print(a.dict()) # {'k': <S.am: 'am'>, 'z': 'rrrr'}
我正在尝试让
.dict()
方法返回{'k': 'am', 'z': 'rrrr'}
您需要使用
use_enum_values
选项model config:
use_enum_values
是否使用枚举的
属性而不是原始枚举来填充模型。如果您想稍后序列化value
(默认值:model.dict()
),这可能很有用False
from enum import Enum
from pydantic import BaseModel
class S(str, Enum):
am='am'
pm='pm'
class K(BaseModel):
k:S
z:str
class Config:
use_enum_values = True # <--
a = K(k='am', z='rrrr')
print(a.dict())
jsonable_encoder
:
from enum import Enum
from pydantic import BaseModel
from fastapi.encoders import jsonable_encoder
class S(str, Enum):
am = 'am'
pm = 'pm'
class K(BaseModel):
k: S
z: str
a = K(k='am', z='rrrr')
print(jsonable_encoder(a)) # {'k': 'am', 'z': 'rrrr'}
使用
Config
类的答案是正确的,但可能不是必需的。
重复实施可能不方便,并且对某些读者来说可能是多余的,因此我提供更简单的替代方案和简短的解释。
(Str,Enum)
子类就够了StrEnum
类。这是 added in 3.11 但由于以前的版本不支持它 - 我提供了一个例子。from enum import Enum
class StrEnum(str, Enum):
def __repr__(self) -> str:
return str.__repr__(self.value)
class A(str, Enum):
FOO = "foo"
class B(StrEnum):
BAR= "bar"
class C(BaseModel):
a: A = Field(...)
b: B = Field(...)
print(C(a="foo", b="bar").dict())
import json
print(json.dumps(C(a="foo", b="bar").dict()))
输出:
{'a': <A.FOO: 'foo'>, 'b': 'bar'}
{"a": "foo", "b": "bar"}
类
A
和B
分别属于(str, Enum)
和StrEnum
类型。
两者都是 JSON 可序列化的; StrEnum
也打印为原始字符串。