Ris*_*man 5 python json pydantic fastapi
我有一个从数据库中获取所有数据的路由器。这是我的代码:
@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)
Run Code Online (Sandbox Code Playgroud)
响应是一个包含 JSON 对象的数组,如下所示
[
{
"title": "example1",
"content": "example_content1"
},
{
"title": "example2",
"content": "example_content2"
},
]
Run Code Online (Sandbox Code Playgroud)
但我想做出这样的回应:
{
"items": [
{
"title": "example1",
"content": "example_content1"
},
{
"title": "example2",
"content": "example_content2"
},
]
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?请帮忙。先感谢您
此外,如果您计划重复使用响应模板,您可以使用通用类型创建自定义响应,如下所示
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
Run Code Online (Sandbox Code Playgroud)
@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)
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到 FastAPI 模板 https://github.com/jonra1993/fastapi-alembic-sqlmodel-async/blob/main/fastapi-alembic-sqlmodel-async/app/schemas/response_schema.py
您可以简单地定义另一个包含items列表作为字段的模型:
from pydantic import BaseModel
from typing import List
class ResponseModel(BaseModel):
items: List[articles_schema.Articles]
Run Code Online (Sandbox Code Playgroud)
并在响应中使用它:
@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),
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12009 次 |
| 最近记录: |