正确传参的请求结果
查看 Swagger API 文档
来看看路径操作有什么关于响应模型的参数
response_model_exclude_unset
作用
- 有时候数据会有默认值,比如数据库中设置了默认值,不想返回这些默认值怎么办?
- response_model_exclude_unset=True 设置该参数后就不会返回默认值,只会返回实际设置的值,假设没设置值,则不返回该字段
实际代码
class Item(BaseModel): name: str price: float # 下面三个字段有默认值 description: Optional[str] = None tax: float = 10.5 tags: List[str] = [] items = { "foo": {"name": "Foo", "price": 50.2}, "bar": {"name": "Bar", "description": "The bartenders", "price": 62, "tax": 20.2}, "baz": {"name": "Baz", "description": None, "price": 50.2, "tax": 10.5, "tags": []}, } @app.get("/items/{item_id}", response_model=Item, response_model_exclude_unset=True) async def read_item(item_id: str): # 从上面 items 字典中,根据 item_id 取出对应的值并返回 return items[item_id]
item_id=foo 的请求结果
不会返回有默认值的字段
item_id=bar 的请求结果
只返回了设置值的字段
item_id=baz 的请求结果
- 五个字段都有设置值,所有都包含在响应数据中了
- 即使 description、tax、tags 设置的值和默认值是一样的,FastAPI 仍然能识别出它们是明确设置的值,所以会包含在响应数据中
response_model_include、response_model_exclude
作用
- include:包含
- exclude:排除
- 其实就是响应模型只要包含/排除有些属性
参数数据类型
- 从上面可以看到,这两个参数的类型都是 Optional[Union[SetIntStr, DictIntStrAny]]
- Optional:可选
- Union:联合类型
- 既可以是 SetIntStr,也可以是 DictIntStrAny,满足其一即可
SetIntStr、DictIntStrAny
查看源码可以看到
# set 类型,子元素类型可以是 int、str
SetIntStr = Set[Union[int, str]]
# dict 类型,键类型可以是 int、str,值类型可以是任意类型
DictIntStrAny = Dict[Union[int, str], Any]
官方建议
- 不推荐使用这两个参数,而推荐使用上面讲到的思想,通过多个类来满足请求模型、响应模型
- 因为在 OpenAPI 文档中可以看到 Model 完整的 JSON Schema
response_model_include 的栗子
结合上面注册功能的栗子:请求要密码,响应不要密码
class User(BaseModel): username: str password: str email: EmailStr full_name: Optional[str] = None @app.post("/user/", response_model=User, response_model_include={"username", "email", "full_name"}) async def create_user(user: User): return user
正确传参的请求结果
查看 Swagger API 文档
passwor 仍然存在,这明显不是我们想要的最佳效果,所以还是推荐用多个类的思想
response_model_exclude 的栗子
class User(BaseModel): username: str password: str email: EmailStr full_name: Optional[str] = None @app.post("/user/", response_model=User, response_model_exclude={"password"}) async def create_user(user: User): return user
正确传参的请求结果请求结果
同 include
查看 Swagger API 文档
同 include