FastAPI(22)- Pydantic Model 结合 Union、List 的使用场景
2021-09-25 10:09
330 查看
前言
有多个模型,且请求/响应需要声明多个模型的时候,可以根据不同使用场景结合 typing 库里面的 Union、List 来达到目的
Union
作用
联合类型,详细教程
使用 Union 时,建议首先包含具体的类型,然后是不太具体的类型
实际代码
#!usr/bin/env python # -*- coding:utf-8 _*- """ # author: 小菠萝测试笔记 # blog: https://www.cnblogs.com/poloyy/ # time: 2021/9/22 8:28 上午 # file: 19_extra models.py """ import uvicorn from fastapi import FastAPI from typing import Optional, Union, List, Dict from pydantic import BaseModel, EmailStr app = FastAPI() class BaseItem(BaseModel): description: str type: str class CarItem(BaseItem): # 给了个默认值 type = "car" class PlaneItem(BaseItem): type = "plane" size: int items = { "item1": {"description": "All my friends drive a low rider", "type": "car"}, "item2": { "description": "Music is my aeroplane, it's my aeroplane", "type": "plane", "size": 5, }, } @app.get("/items/{item_id}", response_model=Union[PlaneItem, CarItem]) async def read_item(item_id: str):
# item_id 作为键去 items 中找到对应的值 return items[item_id] if __name__ == "__main__": uvicorn.run(app="20_union_list_dict:app", host="127.0.0.1", port=8080, reload=True, debug=True)
item_id = item1 的请求结果
item_id = item2 的请求结果
List
class Item(BaseModel): name: str description: str items = [ {"name": "Foo", "description": "There comes my hero"}, {"name": "Red", "description": "It's my aeroplane", "size": 123}, # 多了个 size 字段 ] @app.get("/items/", response_model=List[Item]) async def read_items(): return items
正确传参的请求结果
返回的是一个数组
假设响应内容多了个 size
items[1] 多了个 size 字段,但因为响应模型并不包含 size,所以最终返回的数据也不会包含 size
假设响应内容不包含 description
raise ValidationError(errors, field.type_) pydantic.error_wrappers.ValidationError: 1 validation error for Item response -> 1 -> description field required (type=value_error.missing)
- 因为响应模型声明了 name、description 都是必传参数,假设不传就会报错
- 但又因为是响应数据有问题,代表应用程序(服务端)有问题,所以客户端发送请求就会报 500
相关文章推荐
- Qt编程26:QStringListModel与QListView结合使用
- fastjson与Map、List结合使用
- QStringListModel的简单使用
- jquery与google map api结合使用 控件,监听器
- android listview综合使用演示样例_结合数据库操作和listitem单击长按等事件处理
- 语义Web服务的API使用实例:OWL-S API结合matchmaker、推理机(Jena、Pellet)进行语义转换、匹配、组合及调用web服务
- Collections.unmodifiableList方法的使用与场景
- QStringListModel的简单使用
- List结合ArrayAdapter使用
- jqGrid与Struts2的结合应用(六) —— 使用colModel设置查询功能
- 结合 spring ,使用QLExpress做一个淘宝的场景模型,对于场景的描述可以参照这个demo
- android listview综合使用示例_结合数据库操作和listitem单击长按等事件处理
- 如何使用CocosBuilder2.1结合cocos2d-x2.0.3创建动画场景 分享0
- 领域事件与Netty结合的一个使用场景与设计
- 使用Java 8 API,根据传递的分隔符,连接list中所有的元素
- 通过RTLabel、RCLabel、FTCoreText及webView结合SDWebImage等4种方式实现左滑或下拉中cell中图文混排使用场景方案
- Java集合类: Set、List、Map、Queue使用场景梳理
- android map api展示地图及和定位结合使用
- google map api 与jquery结合使用(3) --图标样式,使用xml和异步请求【转帖】
- 使用预定义模型 QStringListModel+QStringlist例子