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

使用Pydantic v2将int转为string:字段验证器失效问题求助

解决Pydantic v2中字段类型统一转换为字符串的问题

你的代码里验证器不生效的核心问题有两个:

  • 两个字段的验证器函数重名了,第二个transform_system_id_to_str会覆盖第一个,导致id字段的验证器完全没起作用
  • 代码存在缩进错误,装饰器和函数的缩进没有和类内其他成员对齐

方案一:分开定义不同名称的验证器

修正后的代码如下:

from pydantic import BaseModel, field_validator

class User(BaseModel):
    system_id: str
    db_id: str
    id: str
    record: dict
    isValid: bool

    @field_validator("id", mode='before')
    def transform_id_to_str(cls, value) -> str:
        return str(value)
    
    @field_validator("system_id", mode='before')
    def transform_system_id_to_str(cls, value: str | int) -> str:
        if isinstance(value, str):
            return value
        return str(value)

方案二:单个验证器处理多个字段(更简洁)

如果两个字段的转换逻辑一致,可以用一个验证器同时处理id和system_id,避免重复代码:

from pydantic import BaseModel, field_validator

class User(BaseModel):
    system_id: str
    db_id: str
    id: str
    record: dict
    isValid: bool

    @field_validator("id", "system_id", mode='before')
    def transform_to_str(cls, value) -> str:
        return str(value)

测试验证

用以下代码测试转换效果:

# 传入int类型的字段数据
user_data = {
    "system_id": 123,
    "db_id": "db_456",
    "id": 789,
    "record": {"name": "test"},
    "isValid": True
}

user = User(**user_data)
print(user.system_id, type(user.system_id))  # 输出: 123 <class 'str'>
print(user.id, type(user.id))                # 输出: 789 <class 'str'>

内容的提问来源于stack exchange,提问作者aero8991

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:25:10