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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:53:20