假设我们在使用 FastAPI 构建 RESTful 服务时要返回一个 User
对象的数据,同时又想实现统一的返回格式,我们可能这样做:
from pydantic import BaseModel
from typing import Any
class RestfulModel(BaseModel):
code: int
msg: str
data: Any
class User(BaseModel):
uid: str
name: str
age: int
@app.get('/get_user', response_model=RestfulModel)
def get_user():
user = User(uid='100', name='example', age=18)
return RestfulModel(code=0, msg='', data=user)
但这样做会使得自动生成的 API 文档无法检测到 User
类型,因此我们可以利用 typing
的泛型来实现:
from pydantic import BaseModel, Field
from pydantic.generics import GenericModel
from typing import Generic, TypeVar, Optional
T = TypeVar('T') # 泛型类型 T
class RestfulModel(GenericModel, Generic[T]):
code: int
msg: str
data: T
class User(BaseModel):
uid: str
name: str
age: int
@app.get('/get_user', response_model=RestfulModel[User])
def get_user():
user = User(uid='100', name='example', age=18)
return RestfulModel(code=0, msg='', data=user)
这样,便既可以实现统一JSON返回格式,又能被 OpenAPI 检测到。