簡體   English   中英

響應 model 作為字符串列表而不是對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM