如果使用响应模型,FastAPI 如何将其他信息(如查询)插入到响应中?

FastAPI how to insert additional Information (like queries) into the Response if you use a Response Model?

我正在尝试使用 FastAPI 构建一个 API。我想在响应中也有一条路线(接受查询)return,这样用户就可以仔细检查他输入的查询(也可以查看总共有多少页等)。

我正在使用 response_model 响应方式,但我终究无法弄清楚如何将额外的参数插入到响应中。

我已经尝试将响应模型中的所有字段设为可选,这样它在检查时不再抛出错误,但它仍然(如果它响应)在没有添加信息的情况下进行响应。 在下面,您可以看到我用于 response_model.

的路由和架构

这是我想要应用的路线。

@router.get("/", response_model=List[schemas.StockResponse], tags=["Stocks"])
def get_stocks(response= Response, 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)
    stocks = db.query(models.Stock).limit(limit).offset(skip).all()
    return stocks

我想要的是它 return 是股票列表,而且 return 是关于上述查询参数的信息。喜欢:

[{"params": {
           "limit" : 10,
           "skip": 0 },
 {"data": [ *then list of dictionaries that it already returns*]}]

类似的东西,但除了字典列表,我什么都不能return。

这是该模型正在使用的架构 (StockResponse)

class StockBase(BaseModel):
    name: str
    ticker: str
    price: float
    dividends: float
    dividend_yield: float
    ftweek_low: Optional[float] = Body(None)
    ftweek_high: Optional[float] = Body(None)
    trading_market: Optional[str] = Body(None)
    market_cap: Optional[int] = Body(None)
    payout_ratio: Optional[float] = Body(None)
    beta: Optional[float] = Body(None)
    business_summary: Optional[str] = Body(None)
    website: Optional[str] = Body(None)
    logo: Optional[str] = Body(None)
    time_updated: Optional[datetime] = Body(datetime.now())
    sector: Optional[str] = Body(None)
    industry: Optional[str] = Body(None)
    
class StockResponse(StockBase):
    ID: Optional[int]
    name: Optional[str]
    ticker: Optional[str]
    price: Optional[float]
    dividends: Optional[float]
    dividend_yield: Optional[float]
    time_created: Optional[datetime]
        
    class Config:
         orm_mode = True    

创建一个匹配您想要的响应模型return,并相应地填充它:

from pydantic import BaseModel


class StockRequestParams(BaseModel):
  limit: int
  skip: int


class StockResponseWithMetadata(BaseModel):
  params: StockRequestParams
  stocks: List[StockResponse]


def get_stocks(...):
  ...
  return StockResponseWithMetadata(
    params=StockRequestParams(hits=hits, limit=limit), 
    stocks=socks,
  )