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

FastAPI入门:请求体的字段、嵌套模型、额外数据、额外数据类型

请求体字段

与在路径操作函数中使用 Query、Path 、Body 声明校验与元数据的方式一样,可以使用 Pydantic 的 Field 在 Pydantic 模型内部声明校验和元数据。

在声明请求体数据模型时可以使用Field定义模型属性

from fastapi import FastAPI, Query , Path, Body
from typing import Annotated, Literal
from pydantic import BaseModel, Fieldclass Item(BaseModel):name: strdescription: str | None = Field(default=None, title="The description of the item",max_length=300)price: float = Field(gt=0,description="The price of the item")tax: float | None = Noneapp = FastAPI()@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Annotated[Item, Body(embed=True)]):result = {"item_id": item_id,"item": item}return result

请求体嵌套模型

List字段

可以将一个属性定义为拥有子元素的类型。例如 Python list

from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Nonetags: list = []@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):results = {"item_id": item_id, "item": item}return results

这将使 tags 成为一个由元素组成的列表。不过它没有声明每个元素的类型。

具有子类型的list字段

 tags: list[str] = []

Set类型

tags: set[str] = set()

嵌套模型

对于不同的pydantic模型,可以实现彼此嵌套

from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Image(BaseModel):url: strname: strclass Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Nonetags: set[str] = set()image: Image | None = None@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):results = {"item_id": item_id, "item": item}return results

对于Item将期待以下格式的请求体

{"name": "Foo","description": "The pretender","price": 42.0,"tax": 3.2,"tags": ["rock", "metal", "bar"],"image": {"url": "http://example.com/baz.jpg","name": "The Foo live"}
}

纯列表请求体

如果你期望的 JSON 请求体的最外层是一个 JSON array(即 Python list),则可以在路径操作函数的参数中声明此类型

from fastapi import FastAPI
from pydantic import BaseModel, HttpUrlapp = FastAPI()class Image(BaseModel):url: HttpUrlname: str@app.post("/images/multiple/")
async def create_multiple_images(images: list[Image]):return images

额外定义数据

可以使用 Config 和 schema_extra 为Pydantic模型声明一个示例

from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Nonemodel_config = {"json_schema_extra": {"examples": [{"name": "Foo","description": "A very nice Item","price": 35.4,"tax": 3.2,}]}}@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):results = {"item_id": item_id, "item": item}return results

这会在doc文档中生成示例
在这里插入图片描述
在Field, Path, Query, Body等声明中也可以附加额外参数

from fastapi import FastAPI
from pydantic import BaseModel, Fieldapp = FastAPI()class Item(BaseModel):name: str = Field(examples=["Foo"])description: str | None = Field(default=None, examples=["A very nice Item"])price: float = Field(examples=[35.4])tax: float | None = Field(default=None, examples=[3.2])@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):results = {"item_id": item_id, "item": item}return results

以及可以将额外参数传递给Body

from typing import Annotatedfrom fastapi import Body, FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = None@app.put("/items/{item_id}")
async def update_item(item_id: int,item: Annotated[Item,Body(examples=[{"name": "Foo","description": "A very nice Item","price": 35.4,"tax": 3.2,}],),],
):results = {"item_id": item_id, "item": item}return results

额外数据类型

可以用到的其他参数类型:

参数类型说明
UUID一种标准的 “通用唯一标识符” ,在许多数据库和系统中用作ID。在请求和响应中将以 str 表示。
datetime.datetime一个 Python datetime.datetime.在请求和响应中将表示为 ISO 8601 格式的 str ,比如: 2008-09-15T15:53:00+05:00.
datetime.datePython datetime.date.在请求和响应中将表示为 ISO 8601 格式的 str ,比如: 2008-09-15.
datetime.time一个 Python datetime.time.在请求和响应中将表示为 ISO 8601 格式的 str ,比如: 14:23:55.003.
datetime.timedelta一个 Python datetime.timedelta.在请求和响应中将表示为 float 代表总秒数。Pydantic 也允许将其表示为 “ISO 8601 时间差异编码”
frozenset在请求和响应中,作为 set 对待:在请求中,列表将被读取,消除重复,并将其转换为一个 set。在响应中 set 将被转换为 list 。产生的模式将指定那些 set 的值是唯一的 (使用 JSON 模式的 uniqueItems)。
bytes标准的 Python bytes。在请求和响应中被当作 str 处理。生成的模式将指定这个 str 是 binary “格式”。
Decimal标准的 Python Decimal。在请求和响应中被当做 float 一样处理。
http://www.dtcms.com/a/304464.html

相关文章:

  • Linux系统部署k8s集群
  • 在 Web3 时代通过自我主权合规重塑 KYC/AML
  • Git快速入门,完整的git项目管理工具教程,git入门到精通!
  • 青少年软件编程图形化Scratch等级考试试卷(二级)2025年6月
  • 【EDA】Calma--早期版图绘制工具商
  • python案例:基于python 神经网络cnn和LDA主题分析的旅游景点满意度分析
  • 解决mac下git pull、push需要输入密码
  • 半导体企业选用的跨网文件交换系统到底应该具备什么功能?
  • 【007TG洞察】美欧贸易新政下跨境业务的技术破局:从数据治理到智能触达的全链路重构
  • SpringBoot整合RocketMQ(rocketmq-client.jar)
  • 小程序中事件对象的属性与方法
  • IT实施方案书
  • 【dropdown组件填坑指南】—怎么实现三角箭头效果
  • 网络安全第15集
  • 河南地区危化品安全员考试题库及答案
  • 【参考】Re
  • MYSQL难面试
  • 汇总数据(使用聚集函数)
  • Element Plus
  • AI数据管家:智能体如何像“超级助手”管理企业数据?
  • 宇树 G1 部署(九)——遥操作控制脚本 teleop_hand_and_arm.py 分析与测试部署
  • 项目如何分阶段推进?几大要点分析
  • 【Linux】初识make/makefile
  • 【C++算法】80.BFS解决FloodFill算法_岛屿数量
  • 数据结构 排序(2)---选择排序
  • 【WRF工具】服务器中安装编译GrADS
  • 组件调用传值、调用函数
  • 信息技术发展与区块链的崛起:深度解析与未来展望
  • Vulkan入门教程 | 第二部分:创建实例
  • 0基礎網站開發技術教學(一) --(前端篇)--