请求体 - 嵌套模型
使用 FastAPI,你可以很随意的实现模型的嵌套、定义、校验、记录文档,并使用任意深度嵌套的模型,这其实都是FastAPI的核心模块P一单提成进行做的。。
List 字段
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
tags: 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 Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
app = FastAPI()
class Team(BaseModel):
# 球队名称
name: str
# 所属区域:东部、西部
area: str
class Player(BaseModel):
# 所属球队
team: Team
# 球员名称
name: str
class Hobby(BaseModel):
name: str
description: Union[str, None] = None
# 分类
category: str
tax: Union[float, None] = None
# 喜欢的球队名称
teams: set[str] = set()
# 喜欢的球员
players: Union[list[Player], None] = None
class Fan(BaseModel):
"""
球迷
"""
# 球迷姓名
name: str
description: 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, HttpUrl
app = FastAPI()
class Image(BaseModel):
url: HttpUrl
name: str
@app.post("/images/multiple/")
async def create_multiple_images(images: list[Image]):
return images
总结
总结一下,FastAPI通过利用Python类型提示和Pydantic库的强大功能,使得处理嵌套模型变得简单易用。只需要定义好你的数据模型,FastAPI就能自动处理请求体的解析和验证,大大提高了开发效率。而实际上,在工作中 ,用到这种写法并不多。