[英]Response model as list of strings instead of objects
我正在嘗試通過 Pydantic model 返回 FastAPI 中的項目列表。
目前我有路線:
from typing import List
from fastapi import Depends
from sqlalchemy.orm.session import Session
...
@router.get('/search-job-types', response_model=List[JobTypeDisplay])
def job_types(search_word: str, db: Session = Depends(get_db)):
return db_dims.search_job_types(search_word, db)
#db_dims:
def search_job_types(search_word: str, db: Session):
s_word = search_word.capitalize()
s_word2 = "%{}%".format(s_word)
all = db.query(DbJobType).filter(DbJobType.name.like(s_word2)).all()
#list_jobs = []
#for item in all:
#list_jobs.append(item.name)
return all
我的模式如下:
from pydantic import BaseModel
class JobTypeDisplay(BaseModel):
name: str
class Config:
orm_mode = True
我得到了這樣的對象列表:
[
{
"name": "Something3"
},
{
"name": "Somethin2"
},
{
"name": "Something1"
}
]
但是想要這樣的東西:
['Something3', 'Somethin2', 'Something1']
實現此目標的最佳方法是什么,我真的需要一個循環嗎?
如果您只對DbJobType
表中name
列的值感興趣,那么您應該1)將數據庫查詢更改為實際上只有 select 該列,以及2)使用Result.scalars
方法僅返回一個字符串列表。
這是它的樣子:
from sqlalchemy.orm.session import Session
from sqlalchemy.sql.expression import select
# ... import DbJobType
def search_job_types(search_word: str, db: Session) -> list[str]:
...
statement = select(DbJobType.name).filter() # add your filter options here
result = db.execute(statement)
return result.scalars().all()
從技術上講,您也不需要為路由指定response_model
。 如果您省略該參數,它仍然有效。 由於不需要進行額外的解析,因此list[str]
的正確返回類型注釋足以為該路由生成正確的 OpenAPI 模式。
from fastapi import Depends, FastAPI
from sqlalchemy.orm.session import Session
# ... import search_job_types
app = FastAPI()
...
@app.get("/search-job-types")
def job_types(search_word: str, db: Session = Depends(get_db)) -> list[str]:
return search_job_types(search_word, db)
似乎,至少對於這條路線,您的JobTypeDisplay
model 已經過時了。
您可以更改為return_model=list[str]
並將返回語句更改為
return [jt.name for jt in all]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.