FastAPI 学习之路(十一)请求体 - 嵌套模型

简介: FastAPI 学习之路(十一)请求体 - 嵌套模型

系列文章:

  FastAPI 学习之路(一)fastapi--高性能web开发框架

  FastAPI 学习之路(二)

  FastAPI 学习之路(三)

  FastAPI 学习之路(四)

  FastAPI 学习之路(五)

     FastAPI 学习之路(六)查询参数,字符串的校验

  FastAPI 学习之路(七)字符串的校验

   FastAPI 学习之路(八)路径参数和数值的校验

  FastAPI 学习之路(九)请求体有多个参数如何处理?

  FastAPI 学习之路(十)请求体的字段



还是之前的例子,我们现在书有这样的一个属性,在哪里出售。我们需要增加这样的一个字段,而且书的可以销售的地方是多个的,那么我们应该如何实现呢。


from typing import Optional
from fastapi import Body, FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Item(BaseModel):
    name: str
    description: Optional[str] = Field(
        None, title="这是描述", max_length=300
    )
    price: float = Field(..., gt=0, description="价格必须大于0")
    tax: Optional[float] = None
    sellarea:list=[]
@app.put("/items/{itemid}")
def update_items(itemid: int, item: Item = Body(..., embed=True)):
    results = {"itemid": itemid, "item": item}
    return results


我们看下我们最后的效果


image.png


这样满足了我们的需求,但是我们期望要设置出售的地区,必须传递每一个地区str类型,那么如何来实现呢。


from typing import Optional,List
from fastapi import Body, FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Item(BaseModel):
    name: str
    description: Optional[str] = Field(
        None, title="这是描述", max_length=300
    )
    price: float = Field(..., gt=0, description="价格必须大于0")
    tax: Optional[float] = None
    sellarea:List[str]=[]
@app.put("/items/{itemid}")
def update_items(itemid: int, item: Item = Body(..., embed=True)):
    results = {"itemid": itemid, "item": item}
    return results


其实实现是很简单的,就是之前的list使用typing 模块中导入 List,这样我们再去定义类型就可以,我们可以看下,加入我们在传递的list中的每一项都是str类型。


image.png


那么当我们传递的有一项是list类型


image.png


这个时候就报错了。不符合预期了。


     当然也可以是Set、dict、tuple都可以。我们可以点进去看typing的源码。


       假如我们现在有一个字段,但是它还是需要一个模型,比如我们有一个图片的。它里面需要有url和name。那么我们应该怎么实现呢


from typing import Optional,List,Dict,Set,Tuple
from fastapi import Body, FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Image(BaseModel):
    url: str
    name: str
class Item(BaseModel):
    name: str
    description: Optional[str] = Field(
        None, title="这是描述", max_length=300
    )
    price: float = Field(..., gt=0, description="价格必须大于0")
    tax: Optional[float] = None
    sellarea:List[str]=[]
    image:Optional[Image]=None
@app.put("/items/{itemid}")
def update_items(itemid: int, item: Item = Body(..., embed=True)):
    results = {"itemid": itemid, "item": item}
    return results


我们看下最后的结果。


image.png


这样我们就实现了模型的嵌套,那么我们其实可能还是希望url是一个http的url,那么我们如何实现呢。


from typing import Optional,List,Dict,Set,Tuple
from fastapi import Body, FastAPI
from pydantic import BaseModel, Field,HttpUrl
app = FastAPI()
class Image(BaseModel):
    url: HttpUrl
    name: str
class Item(BaseModel):
    name: str
    description: Optional[str] = Field(
        None, title="这是描述", max_length=300
    )
    price: float = Field(..., gt=0, description="价格必须大于0")
    tax: Optional[float] = None
    sellarea:List[str]=[]
    image:Optional[Image]=None
@app.put("/items/{itemid}")
def update_items(itemid: int, item: Item = Body(..., embed=True)):
    results = {"itemid": itemid, "item": item}
    return results


最后结果:


image.png


当然我们还可以做一些其他的。比如List之类的校验。


相关文章
|
4天前
|
JSON API 持续交付
逐步指南:使用FastAPI部署YOLO模型的步骤
逐步指南:使用FastAPI部署YOLO模型的步骤
|
4天前
|
JSON API 数据安全/隐私保护
如何使用Fastapi上传文件?先从请求体数据讲起
如何使用Fastapi上传文件?先从请求体数据讲起
|
4天前
|
IDE 测试技术 开发工具
FastAPI 并发请求解析:提高性能的重要特性
在当今的数字化世界中,网络用户对于高速响应和持续连接的诉求日益显著。这促使了基于 Python 构建的 FastAPI 框架受到广泛关注,它不仅现代化且效率极高,而且简化了并行请求的处理。本篇文章旨在探讨 FastAPI 如何处理这类请求,并对应用实例进行实际编码展示。
|
7月前
|
JSON Kubernetes API
使用FastAPI部署Ultralytics YOLOv5模型
YOLO是You Only Look Once(你只看一次)的缩写,它具有识别图像中的物体的非凡能力,在日常应用中会经常被使用。所以在本文中,我们将介绍如何使用FastAPI的集成YOLOv5,这样我们可以将YOLOv5做为API对外提供服务。
168 5
FastAPI(54)- 详解 Request 请求对象(上)
FastAPI(54)- 详解 Request 请求对象(上)
538 0
|
9月前
|
JSON NoSQL API
全面拥抱 FastApi — 响应模型
全面拥抱 FastApi — 响应模型
|
机器学习/深度学习 Python
【Python】fastapi框架之Web部署机器学习模型
【Python】fastapi框架之Web部署机器学习模型
|
存储 SQL 前端开发
FastAPI第三天---文件请求
FastAPI第三天---文件请求
165 0
FastAPI第三天---文件请求
|
前端开发 中间件 测试技术
FastApi的请求拦截
FastApi的请求拦截
688 0
|
XML JSON JavaScript
FastApi-06-请求体-3
FastApi-06-请求体-3
124 0