如何在 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 的参数“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())
我有以下使用 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 的参数“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())