请求体 - 嵌套模型
使用 FastAPI,你可以很随意的实现模型的嵌套、定义、校验、记录文档,并使用任意深度嵌套的模型,这其实都是FastAPI的核心模块P一单提成进行做的。。
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,可以随便填写任意类型的数据,如果我们规定只能填写字符串,只需要稍微改变一下代码
tags: List[str] = []
现在来看下效果
Set 类型
set 类型与list的区别我们都知道,就是数据不能重复。改起来也是相当的容易,直接把List换成Set即可
tags: set[str] = set()
这样,即使你收到带有重复数据的请求,这些数据也会被转换为一组唯一项。
而且,每当你输出该数据时,即使源数据有重复,它们也将作为一组唯一项输出。
嵌套模型
直接来看一个深度较大的嵌套代码示例吧
from typing import Unionfrom fastapi import FastAPI
from pydantic import BaseModel, HttpUrlapp = FastAPI()class Team(BaseModel):# 球队名称name: str# 所属区域:东部、西部area: strclass Player(BaseModel):# 所属球队team: Team# 球员名称name: strclass Hobby(BaseModel):name: strdescription: Union[str, None] = None# 分类category: strtax: Union[float, None] = None# 喜欢的球队名称teams: set[str] = set()# 喜欢的球员players: Union[list[Player], None] = Noneclass Fan(BaseModel):"""球迷"""# 球迷姓名name: strdescription: Union[str, None] = None# 年龄age: int# 爱好hobby: list[Hobby]@app.post("/fan/")
async def create_fan(fan: Fan):return fan
看看效果
纯列表请求体
官网的示例代码
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
总结
总结一下,FastAPI通过利用Python类型提示和Pydantic库的强大功能,使得处理嵌套模型变得简单易用。只需要定义好你的数据模型,FastAPI就能自动处理请求体的解析和验证,大大提高了开发效率。而实际上,在工作中 ,用到这种写法并不多。