使用pydantic+enum校验字段
1.设置enum枚举值
from enum import Enum
from pydantic import BaseModel, NonNegativeInt
class Gender(Enum):
"""设置枚举类型及对应值"""
women = 0
men = 1
2.pydantic引用enum
class UserValid(BaseModel):
"""设置校验字段"""
name: str
age: NonNegativeInt
remark: str = "暂无备注"
gender: Gender # 直接设置gender的校验类型为我们设置的枚举类
3.校验效果
- 传入正确的值
user = UserValid(name="songzi", age=18, gender=0)
print(user.name, user.age, user.remark, user.gender)
#打印结果
#songzi 18 暂无备注 Gender.women
我们可以看到,传入的是枚举值范围的,校验通过。但是值却是Gender.women
。如果我们通过type查看user.gender 的话,会发现类型是<enum 'Gender'>
,如果想要正确输入的值,可以在值后面加上.value
获取正确的值。
user = UserValid(name="songzi", age=18, gender=0)
print(user.name, user.age, user.remark, user.gender.value)
print(type(user.gender.value))
#打印结果
#songzi 18 暂无备注 0
#<class 'int'>
- 传入错误值
如果我们传入的值不是枚举值里面的,比如给gender传0、1之外的任何值,pydantic都会提示错误。
File "pydantic/main.py", line 341, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for UserValid
gender
value is not a valid enumeration member; permitted: 0, 1 (type=type_error.enum; enum_values=[<Gender.women: 0>, <Gender.men: 1>])
4. 总结
之所以我们不直接在pydantic里面直接设置int,是因为这样更方便。我们不但可以限制数字类型,还可以限制数字类型范围。另外还可以使用值去获取对应关系。
5.完整代码:
from enum import Enum
from pydantic import BaseModel, NonNegativeInt
class Gender(Enum):
"""设置枚举类型及对应值"""
women = 0
men = 1
class UserValid(BaseModel):
"""设置校验字段"""
name: str
age: NonNegativeInt
remark: str = "暂无备注"
gender: Gender # 直接设置gender的校验类型为我们设置的枚举类
user = UserValid(name="songzi", age=18, gender=0)
print(user.name, user.age, user.remark, user.gender.value)