Raa*_*mEE 5 python serialization json pydantic
我有以下使用 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())
Run Code Online (Sandbox Code Playgroud)
当我发送 json 等于模型的 dict() 时,我收到错误:
> TypeError:“PetType”类型的对象不可 JSON 序列化
如何克服此错误并使 PetType 也可序列化?
PS 上面的例子简短而简单,但我遇到了一个用例,其中两种情况都发送
json=my_dog.json()
Run Code Online (Sandbox Code Playgroud)
和
json=my_dog.dict()
Run Code Online (Sandbox Code Playgroud)
不工作。这就是为什么我需要使用 dict() 解决发送问题
Raa*_*mEE 12
**<---- 添加 ----> **
在Pydantic 模型配置中查找 Pydantic 的参数“use_enum_values”
use_enum_values 是否使用枚举的 value 属性而不是原始枚举来填充模型。如果您想稍后序列化 model.dict() 这可能很有用(默认值:False)
看起来将此值设置为 True 的效果与下面的解决方案相同。
事实证明,这是 ENum 的行为,此处讨论:https://github.com/samuelcolvin/pydantic/issues/2278
您应该定义枚举的方式是使用
class PetType(str, Enum):
Run Code Online (Sandbox Code Playgroud)
代替
class PetType(Enum):
Run Code Online (Sandbox Code Playgroud)
对于整数,这个Python的Enum库提供了IntEnum类型: https://docs.python.org/3.10/library/enum.html#enum.IntEnum
这基本上是
class IntEnum(int, Enum):
pass
Run Code Online (Sandbox Code Playgroud)
如果您查看上面的 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())
Run Code Online (Sandbox Code Playgroud)