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



我有以下代码,使用Pydantic BaseModel数据类

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(),我得到错误:

比;TypeError: 'PetType'类型的对象不是JSON序列化的

我如何克服这个错误,使PetType也可序列化?

注:上面的例子简短而简单,但我遇到了这样一个用例,即发送

的两种情况
json=my_dog.json() 

json=my_dog.dict() 

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

发送的问题

* * & lt;——添加——比;* *

查找Pydantic的参数"use_enum_values"在Pydantic Model Config

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

看起来将此值设置为True将与下面的解决方案相同。


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

定义枚举的方法是使用
class PetType(str, Enum):

不是

class PetType(Enum):

对于整数,Python的Enum库提供了intum类型: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())

最新更新