Fastapi 自定义响应模型

Fastapi custom response model

我有一个从数据库中获取所有数据的路由器。这是我的代码:

@router.get('/articles/', response_model=List[articles_schema.Articles])
async def main_endpoint():
    query = articles_model.articles.select().where(articles_model.articles.c.status == 2)
    return await db.database.fetch_all(query)

响应是一个包含 JSON 个像这样的对象的数组

[
    {
        "title": "example1",
        "content": "example_content1"
    },
    {
        "title": "example2",
        "content": "example_content2"
    },
]

但是我想这样回复:

{
    "items": [
        {
            "title": "example1",
            "content": "example_content1"
        },
        {
            "title": "example2",
            "content": "example_content2"
        },
    ]
}

我怎样才能做到这一点?请帮忙。提前谢谢你

您可以简单地定义另一个包含 items 列表的模型作为字段:

from pydantic import BaseModel
from typing import List

class ResponseModel(BaseModel):
    items: List[articles_schema.Articles]

并在响应中使用它:

@router.get('/articles/', response_model=ResponseModel)
async def main_endpoint():
    query = articles_model.articles.select().where(
        articles_model.articles.c.status == 2
    )
    return ResponseModel(
        items=await db.database.fetch_all(query),
    )

此外,如果您打算重复使用响应模板,您可以使用通用类型创建自定义响应,如下所示

from typing import Any, Generic, List, Optional, TypeVar
from pydantic import BaseModel
from pydantic.generics import GenericModel

DataType = TypeVar("DataType")

class IResponseBase(GenericModel, Generic[DataType]):
    message: str = ""
    meta: dict = {}
    items: Optional[DataType] = None

@router.get('/articles/', response_model=IResponseBase[List[Articles]])
async def main_endpoint():
    query = articles_model.articles.select().where(articles_model.articles.c.status == 2)
    items=await db.database.fetch_all(query)
    return IResponseBase[List[Articles]](items=items)

您可以在此处找到 FastAPI 模板 https://github.com/jonra1993/fastapi-alembic-sqlmodel-async/blob/main/fastapi-alembic-sqlmodel-async/app/schemas/common.py