FastAPI(22)- Pydantic Model 结合 Union、List 的使用场景

简介: FastAPI(22)- Pydantic Model 结合 Union、List 的使用场景

前言


有多个模型,且请求/响应需要声明多个模型的时候,可以根据不同使用场景结合 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)


image.png

image.png

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


正确传参的请求结果

image.png


返回的是一个数组

 

假设响应内容多了个 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


image.png

相关文章
|
5月前
|
存储 Python
Python中list, tuple, dict,set的区别和使用场景
Python中list, tuple, dict,set的区别和使用场景
183 2
|
存储 消息中间件 NoSQL
12Redis - 存储list(使用场景)
12Redis - 存储list(使用场景)
44 0
|
存储 NoSQL Redis
Redis 数据类型list以及使用场景
Redis 数据类型list以及使用场景
676 3
Redis 数据类型list以及使用场景
|
JSON API 数据库
FastAPI(19)- Response Model 响应模型 (下)
FastAPI(19)- Response Model 响应模型 (下)
335 0
FastAPI(19)- Response Model 响应模型 (下)
|
JSON API 数据库
FastAPI(19)- Response Model 响应模型 (上)
FastAPI(19)- Response Model 响应模型 (上)
322 0
FastAPI(19)- Response Model 响应模型 (上)
|
IDE API 开发工具
FastAPI(14)- 路径操作函数参数的类型是一个嵌套 Pydantic Model 的使用场景
FastAPI(14)- 路径操作函数参数的类型是一个嵌套 Pydantic Model 的使用场景
200 0
FastAPI(14)- 路径操作函数参数的类型是一个嵌套 Pydantic Model 的使用场景
|
JSON API 数据格式
FastAPI(13)- 详解 Fields,针对 Pydantic Model 内部字段添加额外校验和元数据
FastAPI(13)- 详解 Fields,针对 Pydantic Model 内部字段添加额外校验和元数据
551 0
FastAPI(13)- 详解 Fields,针对 Pydantic Model 内部字段添加额外校验和元数据
FastAPI - 解决运行 uvicorn 报错 ImportError: email-validator is not installed, run `pip install pydantic[email]`
FastAPI - 解决运行 uvicorn 报错 ImportError: email-validator is not installed, run `pip install pydantic[email]`
704 0
|
5月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
912 1
|
4月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。