当前位置: 首页 > 知识库问答 >
问题:

sqlalchemy - 如何在FastAPI中统一返回格式,同时保留Pydantic数据模型?

贺自明
2024-01-14

在FastAPI中,我使用了SQLAlchemy和Pydanic返回数据

@router.get("/1", response_model=User)def read_user(db: Session = Depends(get_db)):    db_user = user_module.get_user(db, user_id="1")    if db_user is None:        raise HTTPException(status_code=404, detail="找不到用户")    return db_user

这种方式可以帮助我规范化返回的模型,但是我想要将所有api统一返回格式为{"code":0,"msg":"success","data":{...}},使原本返回模型中User的模型置于data中,方便前端管理。

我尝试了使用FastAPI中间件来实现,但是在swagger等文档中无法识别返回模型User;如果重新定义一个通用的Pydantic返回模型嵌套模型,就无法对SQLAlchemy返回的数据模型处理为想要的User模型,请求社区大佬们帮忙解决,万分感谢!

共有1个答案

司允晨
2024-01-14

在FastAPI中,你可以通过创建一个自定义的响应类来统一你的API的返回格式。这个自定义的响应类可以继承自FastAPI的Response类,并且可以定义你想要的返回格式。

首先,你需要创建一个新的Pydantic模型来作为你的通用返回格式。这个模型可以包含你想要的任何字段,比如code, msg, 和 data

from pydantic import BaseModelclass CommonResponse(BaseModel):    code: int    msg: str    data: dict

然后,你可以在每个路由中使用这个新的响应模型。假设你仍然希望User模型是你的返回数据的核心,你可以将它作为CommonResponse模型中的data字段。

from sqlalchemy.orm import Sessionfrom sqlalchemy import create_engine, funcfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import sessionmakerfrom fastapi import FastAPI, Depends, HTTPExceptionfrom pydantic import BaseModel, ValidationErrorfrom typing import List, Dict, Anyimport datetimeapp = FastAPI()# 定义通用的响应模型class CommonResponse(BaseModel):    code: int    msg: str    data: dict# 创建数据库模型和表Base = declarative_base()class User(Base):    __tablename__ = 'users'    id = Column(Integer, primary_key=True)    name = Column(String)    email = Column(String)    # 其他字段...    # ...# 创建数据库引擎和会话类engine = create_engine('sqlite:///test.db')  # 根据你的数据库配置修改这个URLBase.metadata.create_all(engine)  # 创建表SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)  # 创建会话类@app.get("/1", response_model=CommonResponse)  # 使用通用的响应模型async def read_user(db: Session = Depends(get_db)):  # 使用SQLAlchemy的会话作为依赖项    db_user = User.query.get(1)  # 查询用户ID为1的用户,根据实际情况修改这个查询语句    if db_user is None:  # 如果用户不存在,抛出HTTPException异常        raise HTTPException(status_code=404, detail="找不到用户")    return CommonResponse(code=0, msg="success", data=db_user.dict())  # 将用户对象转换为字典,并作为通用响应模型的`data`字段返回

在这个例子中,我使用了SQLAlchemy来查询数据库,并将查询结果转换为字典。然后,我将这个字典作为通用响应模型的data字段返回。这样,你就可以在你的API中统一返回格式,同时保留Pydantic数据模型。

 类似资料:
  • 我用的是全栈-fastapi-postgresql,fastapi 0 . 54 . 1版,pydantic版。 我不知道如何设置pydantic,因此它可以在SQLAlchemy中正确地使用多对一双向关系。出于某种原因,我当前的实现会以最大递归错误破坏堆栈。 我知道github的一个讨论,来自_orm()应该在加载SQLAlchemy双向关系时检测循环,而不是吹栈。我相信这是密切相关的,但我不能

  • 问题内容: 从如何在PostgreSql的预订表中找到第一次空闲时间的最佳答案中选择 用于查找在给定日期和时间(2012年11月17日:在下面的示例中)开始的时间表中的间隔,它还可以查找周六,周日和公共假日。表中定义了公众假期 如何也排除周末和公共假期? 硬编码空闲时间作为查询之类的保留时间 对于每个空闲时间范围,都需要在联合中有单独的行。 从给定的日期和时间开始,在工作日和工作时间(8:00 .

  • 我正在构建一个FastAPI应用程序,它有很多Pydantic模型。尽管应用程序运行良好,但正如所料,OpenAPI (Swagger UI)文档并没有在< code>Schemas部分显示所有这些模型的模式。 下面是pydantic<code>模式的内容。py</code> 所有这些模型实际上都在FastAPI路径中用于验证请求体。< code>FaultQueryParams是一个自定义模型,

  • 问题内容: 我在网上找到的大多数示例都显示了如何删除空格-但就我而言,我需要保留它。 我希望保留空白(“ html”变量包含pre标记的内容),但是似乎用一个空格代替了多个空格。 如何保存/获取给定beautifulsoup解析器的原始内容? 问题答案: 如果您要解析的内容在 保留空白。

  • 本文向大家介绍Springmvc如何返回xml及json格式数据,包括了Springmvc如何返回xml及json格式数据的使用技巧和注意事项,需要的朋友参考一下 问:@ResponseBody注解怎么指定返回xml 还是json 答:@RequestMapping 的produces 属性指定 produces = "application/xml" 或者 produces = "applica

  • 主要内容:1.接口相互作用,2.返回格式,3.数据,4.控制层控制器,5.美观美化,6.优雅优化,7.其他优化方案1.接口相互作用 前端和前端进行交互,前端按约定的请求URL路径,并合并相关参数,进入服务器接收请求,进行业务处理,返回数据给前端。 2.返回格式 我们可以参考这样的设计,这样的好处就把错误类型归类到某个区间内,如果区间不够,可以设计成4个数字。 这样前端开发人员在得到返回值后,根据状态码就可以知道,大概什么错误,再根据消息相关的信息描述,可以快速定位。 状态码和信息就会一一对应,比