FastAPI+MongoDB构建TODO应用POST路由报错求助
问题原因
报错的核心是你从create_todo函数返回了MongoDB的InsertOneResult对象,而FastAPI的response_model=Todo要求返回值必须符合Todo模型的结构。InsertOneResult是MongoDB插入操作的结果对象,包含插入ID等元数据,但它不是可序列化的字典/对象,也不符合Todo的字段定义,所以FastAPI在序列化时抛出了500错误。
至于数据能存入数据库,是因为collection.insert_one(document)确实成功执行了,错误出在后续的返回值序列化环节,和插入操作本身无关。
修复方案
方案1:修改database.py,返回符合Todo结构的数据
插入文档后,返回原todo数据(或结合生成的_id),确保返回值匹配模型要求:
async def create_todo(todo): document = todo await collection.insert_one(document) # 返回原始todo字典,符合Todo模型的字段定义 return todo
如果需要返回MongoDB生成的ID,可以调整为:
async def create_todo(todo): document = todo result = await collection.insert_one(document) # 把ID转为字符串后返回,避免ObjectId序列化问题 return {**todo, "_id": str(result.inserted_id)}
方案2:更新model.py支持ID返回(可选)
如果需要把_id返回给前端,修改模型添加可选ID字段:
from pydantic import BaseModel from typing import Optional class Todo(BaseModel): title : str description : str _id: Optional[str] = None
方案3:修改main.py的返回逻辑
在路由层直接处理返回值,确保返回符合模型的数据:
@app.post("/api/todo", response_model = Todo) async def post_todo(todo: Todo): result = await create_todo(todo.dict()) if result.inserted_id: # 返回原始todo数据,匹配模型结构 return todo.dict() else: raise HTTPException(400, "Something went wrong. Try again.")
验证修复
修改后重启应用,通过SwaggerUI提交请求,此时返回的是符合Todo模型的数据,FastAPI能正常序列化,500错误会消失,同时数据也能正确存入数据库。
内容的提问来源于stack exchange,提问作者Eeshaan
相关产品推荐
相关产品推荐

