官方文档:响应模型 - FastAPI (tiangolo.com)
"""
response_model 作用
1. 限制返回数据,仅显示模型需要的字段(
如果必要,但是没有则报错,如果有多余,则省略掉);
不会减少db层耗时
2. 接口文档生成 schema
"""
响应模型
from pydantic import BaseModel
from typing import Optional
class User(BaseModel):
username: str
password: str
id: Optional[int]
"""
response_model 作用
1. 限制返回数据,仅显示模型需要的字段(如果必要,但是没有则报错,如果有多余,则省略掉);不回减少db层耗时
2. 接口文档生成 schema
"""
@app.get("/r", response_model=User)
async def r():
return User(username="age", password="123", id=100)
@app.get("/r2", response_model=User)
async def r2():
# 返回数据 {
# "username": "age",
# "password": "123",
# "id": null
# }
return {"username": "age", "password": "123", "kk": "age"}
# 排除字段 用的不多基本在定义pydanitc model 的时候就忽略了
@app.get("/r1", response_model=User,
response_model_exclude_unset=True, # 排除返回数据包含默认值的
response_model_include={"username"}, # 包含字段
response_model_exclude={"password", }, # 排除字段
)
async def r1():
user = User(username="age", password="123")
# 最终返回 {"username": "age"}
return user
通用响应模型
ps: 通常项目中我们不会直接返回数据,而是更多的使用下面的形式
{
"code": 400, # 业务code
"msg": "sss", # 业务msg
"data": null # 实际的数据
}
另一方面通过这类模型可以实现不同data类型生成的 接口文档不一致
from pydantic import BaseModel
from typing import TypeVar, Generic
from pydantic.generics import GenericModel
class User(BaseModel):
username: str
password: str
id: Optional[int]
class Role(BaseModel):
rid: int
role: str
user: User
# 泛型类型
T = TypeVar('T')
"""
https://pydantic-docs.helpmanual.io/usage/models/#generic-models
"""
from enum import IntEnum
# 业务code
class StatusCodeEnums(IntEnum):
# 成功
SUCCESS: int = 20000
# 创建成功
CREATE_SUCCESS: int = 20001
# 删除成功
DELETE_SUCCESS: int = 20004
# 身份验证失败
UNAUTHORIZED: int = 40001
# 服务器错误
ERROR: int = 50000
# 通用响应模型; Generic[T] 泛型类
class R(GenericModel, Generic[T]):
code: int
msg: str
# 表示data可以为None, 或者就是T类型 -> 使用时决定对应类型 R[T]
data: Optional[T]
@staticmethod
def success(data: Optional[T] = None, msg: str = "ok"):
return R(code=StatusCodeEnums.ERROR, msg=msg, data=data)
@staticmethod
def fail(msg: Optional[str] = "失败", data: Optional[T] = None):
return R(code=400, msg=msg, data=data)
@app.get("/ok", response_model=R[User])
async def ok():
return R.success(data=User(username="111", password="123"))
@app.get("/fail", response_model=R[Role])
async def fail():
return R.fail("sss")
user schema
class User(BaseModel):
username: str
password: str
id: Optional[int]

role schema
class Role(BaseModel):
rid: int
role: str
user: User
