FastAPI 0.103(Pydantic2)ResponseValidationError类型转换不一致问题咨询
FastAPI 0.103(搭配Pydantic 2)响应模型类型转换行为差异及解决办法
问题现象
迁移到FastAPI 0.103+Pydantic 2后,响应模型的类型转换出现不对称情况:
- 当响应模型声明为
int类型,返回string格式的数字时,会自动转换为整数返回(比如返回"123"会转成123) - 但当响应模型声明为
string类型,返回int值时,会直接触发fastapi.exceptions.ResponseValidationError,无法自动转换为字符串
示例代码:
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class IntMessage(BaseModel): message: int class StrMessage(BaseModel): message: str # 正常返回 {"message":123} @app.get("/str_to_int", response_model=IntMessage) async def msg_str(): return {"message": "123"} # 触发ResponseValidationError @app.get("/int_to_str", response_model=StrMessage) async def msg_int(): return {"message": 123}
原因分析
这是Pydantic 2的默认验证规则变更导致的:
- 对于
int类型,Pydantic 2默认允许从可转换的字符串自动解析,属于宽松模式的默认行为 - 对于
string类型,默认不允许从整数自动转换,而且单独给Field设置strict=False无效——因为strict=False是针对字段的输入验证,而响应模型的序列化验证由模型的全局配置控制
解决办法:恢复自动转换字符串的原有行为
给对应的BaseModel添加全局模型配置model_config = {"strict": False},让整个模型的字段启用宽松模式,允许自动类型转换:
修改后的代码:
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class IntMessage(BaseModel): message: int class StrMessage(BaseModel): model_config = {"strict": False} # 全局开启宽松模式 message: str @app.get("/str_to_int", response_model=IntMessage) async def msg_str(): return {"message": "123"} @app.get("/int_to_str", response_model=StrMessage) async def msg_int(): return {"message": 123}
修改后,/int_to_str接口会自动把整数123转换为字符串"123"返回,不再触发验证错误。
相关说明
这个行为变化是Pydantic 2的核心变更之一,FastAPI适配Pydantic 2时沿用了该规则。Pydantic 2默认启用更严格的类型验证,宽松模式需要通过模型全局配置开启,单独的Field设置无法覆盖响应序列化的全局验证规则。
内容的提问来源于stack exchange,提问作者vanishingESCkey
相关产品推荐
相关产品推荐

