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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:18:00