前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FastAPI(22)- Pydantic Model 结合 Union、List 的使用场景

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

作者头像
小菠萝测试笔记
发布2021-09-27 15:53:34
1.4K0
发布2021-09-27 15:53:34
举报

前言

有多个模型,且请求/响应需要声明多个模型的时候,可以根据不同使用场景结合 typing 库里面的 Union、List 来达到目的

Union

作用

联合类型,详细教程

使用 Union 时,建议首先包含具体的类型,然后是不太具体的类型

实际代码
代码语言:javascript
复制
#!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

代码语言:javascript
复制
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

items1 多了个 size 字段,但因为响应模型并不包含 size,所以最终返回的数据也不会包含 size

假设响应内容不包含 description
代码语言:javascript
复制
    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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-09-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Union
    • 作用
      • 实际代码
        • item_id = item1 的请求结果
          • item_id = item2 的请求结果
          • List
            • 正确传参的请求结果
              • 假设响应内容多了个 size
                • 假设响应内容不包含 description
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档