You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 03:03:34