如何在 Pydantic BaseModel 中 JSON 序列化 ENum 类

How to JSON serialize ENum classes in Pydantic BaseModel

我有以下使用 Pydantic BaseModel 数据的代码 class

from enum import Enum

import requests
from pydantic import BaseModel
from requests import Response


class PetType(Enum):
    DOG: str = 'dog'
    CAT: str = 'cat'


class Pet(BaseModel):
    name: str
    type: PetType


my_dog: Pet = Pet(name='Lucky', type=PetType.DOG)

# This works
resp: Response = requests.post('https://postman-echo.com/post', json=my_dog.json())
print(resp.json())

#This doesn't work
resp: Response = requests.post('https://postman-echo.com/post', json=my_dog.dict())
print(resp.json())

当我发送 json 等于模型的 dict() 时,我收到错误:

> 类型错误:'PetType' 类型的对象不是 JSON 可序列化的

如何克服此错误并使 PetType 也可序列化?

P.S. 上面的例子很简短,但我遇到了一个用例,其中两种情况都是发送

json=my_dog.json() 

json=my_dog.dict() 

不工作。这就是为什么我需要使用 dict()

解决发送问题

**<----加法----> **

Pydantic Model Config

中查找 Pydantic 的参数“use_enum_values”

use_enum_values 是否使用枚举值 属性 而非原始枚举来填充模型。如果您想稍后序列化 model.dict(),这可能很有用(默认值:False)

看起来将此值设置为 True 将执行与以下解决方案相同的操作。


原来这是ENum的一个行为,在这里讨论:https://github.com/samuelcolvin/pydantic/issues/2278

您应该定义枚举的方式是使用

class PetType(str, Enum):

而不是

class PetType(Enum):

对于整数,这个 Python 的枚举库提供了 IntEnum 类型: https://docs.python.org/3.10/library/enum.html#enum.IntEnum

这基本上是

class IntEnum(int, Enum):
    pass

如果你查看上面的 Enum 文档,你会发现像 StrEnum 这样的类型并不存在,但是按照 PetType 的例子你可以很容易地定义它。

我在下面附上工作代码

from enum import Enum

import requests
from pydantic import BaseModel
from requests import Response


class PetType(str, Enum):
    DOG: str = 'dog'
    CAT: str = 'cat'


class Pet(BaseModel):
    name: str
    type: PetType


my_dog: Pet = Pet(name='Lucky', type=PetType.DOG)

# This works
resp: Response = requests.post('https://postman-echo.com/post', json=my_dog.json())
print(resp.json())

# Now this also works
resp: Response = requests.post('https://postman-echo.com/post', json=my_dog.dict())
print(resp.json())