如何在FastAPI响应中返回指定格式的标签列表?
解决方案
方法1:直接调整响应模型与结果提取(推荐)
这是最简洁的方式,直接匹配你期望的响应格式:
- 修改
TagList模型,将tags字段定义为字符串列表:
from typing import List from pydantic import BaseModel class TagList(BaseModel): tags: List[str] = [] class Config: from_attributes = True
- 在端点代码中,提取查询结果里的
name字段值,生成纯字符串列表:
@router.get('/tags', response_model=TagList, status_code=200) def read_tools(db: Session = Depends(get_session)): with db as session: query = """ select name from tags """ result = session.execute(text(query)) # 提取每个结果中的name值,得到纯字符串列表 tags = result.scalars().all() return {'tags': tags}
方法2:保留Tag模型的适配方案
如果必须保留Tag模型,可以通过字段修正和自定义序列化实现:
- 修正
Tag模型的字段名,与数据库字段匹配:
class Tag(BaseModel): name: str # 将原字段名`nome`改为`name`,对齐数据库字段 class Config: from_attributes = True
- 为
Tag模型添加自定义序列化规则,让它序列化为字符串:
from pydantic import BaseModel class Tag(BaseModel): name: str class Config: from_attributes = True json_encoders = { Tag: lambda tag: tag.name }
问题根源说明
- 原响应模型
TagList定义为List[Tag],FastAPI会自动将每个查询结果转为Tag对象,因此返回对象数组;而你需要的是字符串数组,响应模型必须对应调整为List[str]。 - 数据库查询返回的是
Row对象,必须提取其中的name字段值,才能得到纯字符串,否则直接返回Row会被解析为包含字段的字典。
内容的提问来源于stack exchange,提问作者Hidan
相关产品推荐
相关产品推荐

