Pydantic 枚举字段不会转换为字符串

问题描述 投票:0回答:3

我试图将一个类中的一个字段限制为一个枚举。但是,当我尝试从类中获取字典时,它不会转换为字符串。相反,它保留枚举。我检查了 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'}

python serialization fastapi pydantic
3个回答
123
投票

您需要使用

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())

6
投票

你可以使用 FastAPI 的

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'}

0
投票

使用

Config
类的答案是正确的,但可能不是必需的。 重复实施可能不方便,并且对某些读者来说可能是多余的,因此我提供更简单的替代方案和简短的解释。

TL;博士

  • 对于JSON序列化,什么都不用做。不用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
也打印为原始字符串。

© www.soinside.com 2019 - 2024. All rights reserved.