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
相关产品推荐
相关产品推荐

