如何在FastAPI中传入自定义类的列表?
解决FastAPI中传入自定义类列表时的"'my_class' object is not subscriptable"异常
问题根源
出现这个错误的核心原因有两个:
- 自定义类
my_class没有继承FastAPI依赖的pydantic.BaseModel,导致FastAPI无法将请求体的JSON数据解析为该类的实例,同时泛型类型注解处理出错。 - 若使用Python 3.8及以下版本,直接使用
List而未从typing模块导入,或者类型注解的写法不符合泛型要求。
正确实现步骤
让自定义类继承
pydantic.BaseModel
FastAPI依赖Pydantic做请求体的校验和解析,自定义类必须继承BaseModel才能被正确识别:from pydantic import BaseModel class MyClass(BaseModel): # 根据实际需求定义字段,比如: id: int content: str正确使用类型注解
- 如果你用的是Python 3.9及以上版本,可以直接用原生的
list泛型:@router.post("/predict") async def predict(json_list: list[MyClass]) -> dict: # 这里json_list的每个元素都是MyClass的实例,可直接访问字段 return {"total_items": len(json_list)} - 如果你用的是Python 3.8及以下版本,需要从
typing模块导入List:from typing import List @router.post("/predict") async def predict(json_list: List[MyClass]) -> dict: return {"total_items": len(json_list)}
- 如果你用的是Python 3.9及以上版本,可以直接用原生的
验证请求
发送POST请求到/predict时,请求体可以传如下格式的JSON数组:
[ {"id": 1, "content": "test1"}, {"id": 2, "content": "test2"} ]
FastAPI会自动将其解析为MyClass实例的列表,你可以直接在接口函数中使用。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

