如果使用响应模型,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,
)
我正在尝试使用 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,
)