Pydantic 2中如何实现枚举字段的字符串自动转换(保留类型提示)
解决方案
针对你的需求,这里提供一个基于Pydantic 2.x before模式验证器的实现,既能让枚举字段支持字符串或枚举实例输入,又能保留字段的纯枚举类型提示:
from enum import Enum from pydantic import BaseModel, model_validator class MyEnum(Enum): OPTION1 = "option1" OPTION2 = "option2" class MyModel(BaseModel): enum_field: MyEnum other_field: str @model_validator(mode="before") def convert_string_enums(cls, values: dict) -> dict: # 遍历模型所有字段,自动处理枚举类型字段 for field_name, field in cls.model_fields.items(): field_type = field.annotation # 判断当前字段是否为枚举类 if isinstance(field_type, type) and issubclass(field_type, Enum): value = values.get(field_name) # 仅当值为字符串时尝试转换 if isinstance(value, str): try: values[field_name] = field_type(value) except ValueError: # 不拦截无效值错误,交给Pydantic默认验证抛出标准异常 pass return values # 测试用例1:传入字符串形式的枚举值 test_case_1 = MyModel(enum_field="option1", other_field="test_str") assert test_case_1.enum_field == MyEnum.OPTION1 assert isinstance(test_case_1.enum_field, MyEnum) # 测试用例2:传入枚举实例 test_case_2 = MyModel(enum_field=MyEnum.OPTION2, other_field="test_enum") assert test_case_2.enum_field == MyEnum.OPTION2 assert isinstance(test_case_2.enum_field, MyEnum)
核心细节说明
before模式验证器:该验证器在Pydantic默认字段校验前执行,提前将字符串转换为枚举实例,确保后续校验看到的是符合类型提示的枚举对象,避免类型错误。- 自动批量处理:通过遍历模型字段并检测枚举类型,实现所有枚举字段的自动转换,无需为每个枚举字段单独编写逻辑。
- 保留原有校验逻辑:若传入的字符串不是有效枚举值,不捕获
ValueError,让Pydantic抛出标准的枚举值无效异常,保持原有校验行为一致。 - 类型安全:字段类型提示仍为纯枚举类型,依赖该字段的代码不会出现类型检查问题。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

