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

Pydantic v2迁移:整数转字符串验证失败,求非显式转换方案

Pydantic v2整数转字符串验证失败的温和解决办法

问题背景

迁移项目到Pydantic v2后,原本v1中能自动将整数转为字符串的场景现在触发了验证错误。示例代码如下:

from pydantic import BaseModel

class Foo(BaseModel):
    bar: str

Foo(bar=1)

运行后抛出异常:

ValidationError: 1 validation error for Foo
bar
  Input should be a valid string [type=string_type, input_value=1, input_type=int]

Pydantic v1中会自动把1转为'1',但v2默认启用了严格模式,不会自动做这类类型转换。

解决办法

不需要手动用str(1)转换,有几种温和的方式实现自动转换:

1. 单个字段关闭严格模式

给目标字段添加strict=False参数,允许Pydantic自动转换兼容类型:

from pydantic import BaseModel, Field

class Foo(BaseModel):
    bar: str = Field(strict=False)

# 执行成功,bar的值为"1"
Foo(bar=1)

2. 自定义可自动转换的字符串类型

用Annotated结合PlainSerializer定义一个通用的自动转换字符串类型,方便复用:

from pydantic import BaseModel, PlainSerializer
from typing import Annotated

# 定义一个能自动将兼容类型转为字符串的类型
AutoStr = Annotated[str, PlainSerializer(lambda x: str(x), return_type=str)]

class Foo(BaseModel):
    bar: AutoStr

# 执行成功,bar的值为"1"
Foo(bar=1)

3. 全局关闭模型的严格模式

如果希望整个模型的所有字段都允许自动转换兼容类型,可以在模型配置中设置strict=False:

from pydantic import BaseModel

class Foo(BaseModel):
    bar: str
    
    model_config = {"strict": False}

# 执行成功,bar的值为"1"
Foo(bar=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:40:03