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

FastAPI返回字典时报422 Unprocessable Entity错误如何解决?

问题原因

  • 你在GET接口的路径函数read_item中声明了参数Items: dict,FastAPI默认会将未指定来源(如Query/Path)的复杂类型参数判定为请求体参数,但GET请求本身不携带请求体,因此触发了「请求体字段缺失」的422错误。且该参数无实际作用,还和你定义的Pydantic模型类Items重名,导致你在返回值中尝试调用Items(items=itemslist)时,实际指向的是传入的dict参数,而非Pydantic模型类,逻辑完全错误。
  • 你定义的Items模型的items字段类型是List[Item],也就是列表类型,但你当前使用的itemslist是键值对字典,直接传给items参数不符合类型要求,后续会触发序列化错误。

解决方法

修正后的代码如下:

from typing import List, Optional
   
from fastapi import FastAPI
from pydantic import BaseModel
    
app = FastAPI()
    
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: float = 10.5
    tags: List[str] = []
    
class Items(BaseModel):
    items: List[Item]
    
itemslist = {
    "foo": {"name": "Foo", "price": 50.2},
    "bar": {"name": "Bar", "description": "The bartenders", "price": 62, "tax": 20.2},
    "baz": {"name": "Baz", "description": None, "price": 50.2, "tax": 10.5, "tags": []},
}
   
@app.get("/items", response_model=Items, response_model_exclude_unset=True)
async def read_item():
    # 移除冗余参数,取字典的values转为列表传入模型
    return Items(items=list(itemslist.values()))

如果你希望直接返回字典、不需要手动实例化Pydantic模型,也可以按如下写法,FastAPI会自动用你声明的response_model完成校验和序列化:

@app.get("/items", response_model=Items, response_model_exclude_unset=True)
async def read_item():
    return {"items": list(itemslist.values())}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:27:04