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

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

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

回忆response_model模型

···

···

UNION

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

python 复制代码
from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

app = 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 时,输出结果将是:

json 复制代码
{
  "description": "All my friends drive a low rider",
  "type": "car"
}

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

json 复制代码
{
  "description": "Music is my aeroplane, it's my aeroplane",
  "type": "plane",
  "size": 5
}

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

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

相关推荐
花酒锄作田2 小时前
[python]argparse 包在聊天机器人中的应用
python
NiceCloud喜云4 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
AI玫瑰助手4 小时前
Python函数:默认参数的定义与注意事项
开发语言·python·信息可视化
weixin_468466854 小时前
全局与局部注意力机制新手实战指南
人工智能·python·深度学习·算法·自然语言处理·transformer·注意力机制
小糖学代码5 小时前
LLM系列:环境搭建:5.Python-dotenv 环境变量管理
人工智能·python·深度学习·神经网络
智慧物业老杨5 小时前
智慧物业合同周期管理系统:从风险预警到智能交接的全流程数智化落地方案
java·人工智能·python
橙橙笔记5 小时前
Python的学习第一部分
python·学习
voidmort6 小时前
3. 微调(Fine-tuning)与强化学习(RL)的核心思想
python·深度学习·算法
biter down7 小时前
基于 Pywinauto 的 QQ 音乐 GUI 自动化测试实践
python
人道领域7 小时前
【LeetCode刷题日记】669.修剪二叉搜索树
开发语言·python·算法