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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:27:29