Pydantic自定义validator处理空字符串仍报类型错误如何解决?
问题原因
你写的自定义校验器未生效是因为 Pydantic 默认的校验执行顺序是:先运行字段类型对应的内置校验/转换逻辑,再执行用户定义的普通validator。你传入的空字符串""在进入你写的check_str方法之前,就已经在float/int的内置类型校验阶段抛出错误了。
解决方案
给你的validator装饰器添加pre=True参数,指定这个校验器在所有内置校验之前执行,提前把空字符串替换为合法的数值即可:
from pydantic import BaseModel, validator class Amount(BaseModel): amt: float = 0 cur: int = 0 @validator("amt", "cur", pre=True) # 新增pre=True参数 def check_str(cls, x): if x == "": return 0 # 如果还有字符串格式的合法数值需要转换,也可以在这里统一处理 # 比如处理"123.45"这类字符串可以加:return float(x) if isinstance(x, str) else x return x d = Amount.parse_obj({"amt": "", "cur": ""}) # 运行无报错,d的取值为 Amount(amt=0.0, cur=0)
扩展说明
- 如果你使用的是Pydantic V2版本,只需要把装饰器替换为
@field_validator("amt", "cur", mode="before")即可,逻辑完全一致。 - 如果全项目有大量同类的空字符串转默认值的需求,可以封装统一的自定义字段类型,避免每个类重复写校验逻辑。
内容的提问来源于stack exchange,提问作者Rumotameru
相关产品推荐
相关产品推荐

