当前位置: 首页 > news >正文

深入FastAPI:掌握使用多个关联模型的高级用法[Union类型]

在FastAPI中,响应模型可以声明为Union类型,这允许你为同一个端点定义多种可能的响应模型。这种灵活性使得API可以根据不同的情况返回不同类型的数据结构。

例如,根据请求中的查询参数或数据库中的数据,一个API端点可能有时返回一个用户模型,有时返回一个订单模型。使用Union类型,你可以为这些不同的响应定义一个统一的响应模型,从而提高代码的可维护性和API的可用性。这种方法也有助于在API文档中清晰地展示各种可能的响应类型,为开发者和API用户提供更好的指导。

回忆response_model模型

···
response_model模型
···

UNION

响应类可以声明为多种类型,Union 类型就是其中的一种,从多个响应类内输出一个

from typing import Unionfrom fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()# 定义基础项目模型
class BaseItem(BaseModel):description: str  # 项目的描述type: str  # 项目的类型# 定义特定类型的项目模型
class CarItem(BaseItem):type: str = "car"  # 车辆类型的项目class PlaneItem(BaseItem):type: str = "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,},
}# 定义路由,根据item_id返回对应的项目信息
@app.get("/items/{item_id}", response_model=Union[PlaneItem, CarItem])
async def read_item(item_id: str) -> Union[PlaneItem, CarItem]:  # 根据item_id获取项目信息return items[item_id]

在这个代码中,我们定义了两个模型 CarItemPlaneItem,它们都继承自 BaseItem。我们还定义了一个字典 items 来模拟数据库中的数据。

read_item 函数通过 item_id 参数来获取相应的项目信息,并返回一个 Union[PlaneItem, CarItem] 类型的对象。这意味着函数的返回值可以是 PlaneItem 类型或者 CarItem 类型,这取决于 items 字典中 type 字段的值。

当我们访问 /items/item1 时,输出结果将是:

{"description": "All my friends drive a low rider","type": "car"
}

而当我们访问 /items/item2 时,输出结果将是:

{"description": "Music is my aeroplane, it's my aeroplane","type": "plane","size": 5
}

这些输出结果由FastAPI根据请求的 item_id 参数和 items 字典中的数据自动生成。FastAPI会根据返回值的类型自动序列化为JSON格式。

针对不同场景,可以随意使用不同的 Pydantic 模型继承定义的基类。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 假期学习--load和initialize
  • Linux网络:总结协议拓展
  • 10个好用的查找下载中外文电子图书数据库
  • HTMX:用HTML属性实现AJAX、CSS过渡和WebSockets
  • Windows中cmd命令大全
  • VUE3+Vite 环境变量配置
  • 基于单片机的仔猪喂饲系统设计
  • [CTF夺旗赛] CTFshow Web1-12 详细过程保姆级教程~
  • 苹果账号登录后端验证两种方式 python2
  • 基于springboot+vue实现的在线商城系统
  • 面了 5 家知名企业的NLP算法岗(大模型方向),被问麻了。。。。。
  • Sobel边沿检测
  • TPM赋能智能机器人:重塑工业4.0时代的生产力革命
  • 【解决bug之路】npm install node-sass(^4.14.1)连环报错解决!!!(Windows)
  • 达梦数据库导入dmp文件数据
  • Brief introduction of how to 'Call, Apply and Bind'
  • Golang-长连接-状态推送
  • hadoop集群管理系统搭建规划说明
  • Java Agent 学习笔记
  • JAVA并发编程--1.基础概念
  • js递归,无限分级树形折叠菜单
  • js正则,这点儿就够用了
  • MySQL几个简单SQL的优化
  • Netty源码解析1-Buffer
  • Sublime Text 2/3 绑定Eclipse快捷键
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • vue中实现单选
  • Zepto.js源码学习之二
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 闭包--闭包之tab栏切换(四)
  • 程序员该如何有效的找工作?
  • 程序员最讨厌的9句话,你可有补充?
  • 大数据与云计算学习:数据分析(二)
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 什么是Javascript函数节流?
  • 一个项目push到多个远程Git仓库
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 用Visual Studio开发以太坊智能合约
  • ​香农与信息论三大定律
  • #include<初见C语言之指针(5)>
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $.each()与$(selector).each()
  • (2022 CVPR) Unbiased Teacher v2
  • (33)STM32——485实验笔记
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (回溯) LeetCode 46. 全排列
  • (七)Java对象在Hibernate持久化层的状态
  • (源码分析)springsecurity认证授权
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)Oracle 9i 数据库设计指引全集(1)
  • ******之网络***——物理***
  • *Django中的Ajax 纯js的书写样式1
  • .class文件转换.java_从一个class文件深入理解Java字节码结构