如何让Pydantic模型传入无效字符串时默认使用StrEnum的X值
解决方法
可以通过自定义验证逻辑实现这个需求,下面提供两种常用方案:
方案一:使用Pydantic的BeforeValidator
在字段上添加前置验证器,判断输入是否为有效的Status枚举值,无效则替换为Status.X:
from pydantic import BaseModel, BeforeValidator from enum import StrEnum, auto class Status(StrEnum): X = auto() Y = auto() def validate_status(value): try: return Status(value) except ValueError: return Status.X class Foo(BaseModel): field_a: Status = BeforeValidator(validate_status)
测试示例:
# 正常输入 foo1 = Foo(field_a="X") print(foo1.field_a) # 输出: Status.X # 无效输入自动替换为X foo2 = Foo(field_a="srgsefaa") print(foo2.field_a) # 输出: Status.X
方案二:在枚举类中扩展验证逻辑
直接在Status枚举类中重写验证逻辑,让它支持自动回退到默认值,这样Foo模型无需额外修改:
from pydantic import BaseModel, GetCoreSchemaHandler from enum import StrEnum, auto from pydantic_core import core_schema class Status(StrEnum): X = auto() Y = auto() @classmethod def __get_validators__(cls): yield cls.validate @classmethod def validate(cls, value, handler: GetCoreSchemaHandler): try: return cls(value) except ValueError: return cls.X class Foo(BaseModel): field_a: Status
这种方式下,传入无效字符串时会自动将field_a设为Status.X,不会触发验证错误。
内容的提问来源于stack exchange,提问作者distributer
相关产品推荐
相关产品推荐

