如何让Pydantic 1模型中Enum字段直接返回数值而非枚举实例?
问题描述
我定义了一个用于校验布尔值的枚举类:
class MyEnumClass(int, Enum): true = 1 false = 0
我有134个基于Pydantic 1的模型,每个模型里都有多个字段使用该枚举类做校验。但访问MyPydanticModel.my_boolean_field时,返回的不是1或0,而是MyEnumClass.true或MyEnumClass.false的实例。
原本我打算在每个模型中编写如下验证器方法处理:
@validator('first_boolean_field', 'second_boolean_field', '....', 'last_boolean_field') @classmethod def get_boolean_value(cls, val): return val.value
但给134个模型重复编写该方法过于繁琐,能否直接在枚举类中实现某个方法,让Pydantic模型的布尔字段直接返回真实数值?
解决方案
方法1:给枚举类添加__get_pydantic_value__方法(适配Pydantic 1.x)
直接在枚举类中实现__get_pydantic_value__类方法,Pydantic会自动调用这个方法获取字段的实际返回值,无需修改任何模型:
from enum import Enum class MyEnumClass(int, Enum): true = 1 false = 0 @classmethod def __get_pydantic_value__(cls, value): return value.value
修改后,所有使用MyEnumClass作为字段类型的模型,访问对应字段时都会直接返回1或0的整数值,完全满足需求。
方法2:自定义Pydantic字段类型(更灵活的替代方案)
如果需要兼容更多输入场景(比如直接传入True/False),可以自定义一个内置校验逻辑的字段类型:
from enum import Enum class BooleanInt(int): @classmethod def __get_validators__(cls): yield cls.validate @classmethod def validate(cls, v): if isinstance(v, MyEnumClass): return v.value if v in (0, 1, True, False): return int(v) raise ValueError("仅支持0、1、True、False或MyEnumClass实例")
使用时将模型字段的类型改为BooleanInt,既能保留原枚举类的校验能力,又能直接返回整数值,还支持更多输入格式。
内容的提问来源于stack exchange,提问作者NicWorkAccount
相关产品推荐
相关产品推荐

