FastAPI使用Response Model时如何向响应中插入查询参数等额外信息
解决方案
核心问题是你当前的响应模型直接绑定了股票列表数组结构,FastAPI会自动过滤掉不在响应模型定义内的字段,因此无法插入额外的查询参数、分页信息。按以下步骤修改即可:
1. 新增封装型响应Schema
在你的schema文件中新增两个模型,分别用于定义查询参数结构和最终的响应结构:
from pydantic import BaseModel from typing import List, Optional import math # 查询参数与分页信息模型 class QueryMeta(BaseModel): limit: int skip: int total_count: Optional[int] = None total_page: Optional[int] = None # 最终响应模型,同时包含元信息和股票数据 class StockListResponse(BaseModel): params: QueryMeta data: List[StockResponse] class Config: orm_mode = True
注:你给出的示例返回格式是对象数组,该结构不符合通用API设计规范,前端解析成本更高,这里推荐使用单对象包裹的结构,如果必须用数组格式,可以将响应模型改为
List[dict],但会丢失自动校验能力。
2. 修改路由配置与返回逻辑
调整路由的response_model为新定义的StockListResponse,同时修改返回值结构,把查询参数、分页信息和股票数据一起返回:
@router.get("/", response_model=schemas.StockListResponse, tags=["Stocks"]) def get_stocks(db: Session = Depends(get_db), current_user: int = Depends(oauth2.get_current_user), limit: int = 100, skip: int = 0): utils.increase_request_counter(current_user, db) # 统计总条数与总页数 total_count = db.query(models.Stock).count() total_page = math.ceil(total_count / limit) if limit > 0 else 1 # 查询股票数据 stocks = db.query(models.Stock).limit(limit).offset(skip).all() # 构造响应结构 return { "params": { "limit": limit, "skip": skip, "total_count": total_count, "total_page": total_page }, "data": stocks }
修改完成后接口就会返回包含参数信息和股票数据的标准结构,FastAPI会自动按照你定义的Schema做字段校验,不会过滤掉额外的元信息。
内容的提问来源于stack exchange,提问作者Maximilian Sören Pollak
相关产品推荐
相关产品推荐

