FastAPI 学习之路(十一)请求体 - 嵌套模型
系列文章:
FastAPI 学习之路(一)fastapi--高性能web开发框架
还是之前的例子,我们现在书有这样的一个属性,在哪里出售。我们需要增加这样的一个字段,而且书的可以销售的地方是多个的,那么我们应该如何实现呢。
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
我们看下我们最后的效果
这样满足了我们的需求,但是我们期望要设置出售的地区,必须传递每一个地区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类型。
那么当我们传递的有一项是list类型
这个时候就报错了。不符合预期了。
当然也可以是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
我们看下最后的结果。
这样我们就实现了模型的嵌套,那么我们其实可能还是希望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
最后结果:
当然我们还可以做一些其他的。比如List之类的校验。
文章首发在公众号,欢迎关注。
FastAPI 学习之路(十一)请求体 - 嵌套模型的更多相关文章
- FastAPI 学习之路(十二)接口几个额外信息和额外数据类型
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- FastAPI 学习之路(二十)接口文档配置相关
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- FastAPI 学习之路(十三)Cookie 参数,Header参数
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- FastAPI 学习之路(十四)响应模型
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- FastAPI 学习之路(十五)响应状态码
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- FastAPI 学习之路(十六)Form表单
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- FastAPI 学习之路(十七)上传文件
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- FastAPI 学习之路(十八)表单与文件
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- FastAPI 学习之路(十九)处理错误
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
随机推荐
- Python之requests模块-cookie
cookie并不陌生,与session一样,能够让http请求前后保持状态.与session不同之处,在于cookie数据仅保存于客户端.requests也提供了相应到方法去处理cookie. 在py ...
- 二、grep文本搜索工具
grep命令作为Unix中用于文本搜索的神奇工具,能够接受正则表达式,生成各种格式的输出.除此外,它还有大量有趣的选项. # 搜索包含特定模式的文本行: [root@centos8 ~]#grep p ...
- Flask - 解决 app.run() 添加 host、port、debug 参数后运行不生效的问题
问题背景 app.run() 添加了 host.port.debug 参数,运行后发现没有生效,咋肥事! 解决方案 要打开 debug 模式的话,勾选 FLASK_DEBUG 就好啦 再次运行,发现已 ...
- Identity用户管理入门四(修改、删除用户)
修改用户不能修改Id及用户名所以创建视图模型时需要去除,新增用户跟修改用户基本视图一直,所以不再做演示 一.新建UpdateUserViewModel视图模型 using System.Compone ...
- js判断是在移动端还是在pc端
function chatQQ3(){ if(/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) { //移动端打开 ...
- Java == 和 equals的区别
== 是操作符,equals是方法. 对于基本类型变量来说,只能使用 == ,因为基本类型的变量没有方法.使用==比较是值比较. 对于引用类型的变量来说,==比较的两个引用对象的地址是否相等.所有类都 ...
- 308 day06_线程、同步
day06 [线程.同步] 主要内容 线程 同步 线程状态 教学目标 能够描述Java中多线程运行原理 能够使用继承类的方式创建多线程 能够使用实现接口的方式创建多线程 能够说出实现接口方式的好处 ...
- 【PHP数据结构】交换排序:冒泡、快排
上篇文章中我们好好地学习了一下插入类相关的两个排序,不过,和交换类的排序对比的话,它们真的只是弟弟.甚至可以说,在所有的排序算法中,最出名的两个排序都在今天要介绍的交换排序中了.不管是冒泡.还是快排, ...
- Orchard Core 简介
Orchard Core 是基于ASP.NET Core 对Orchard CMS的 二次开发. Orchard Core由两部分组成: Orchard Core Framework: 一个基于ASP ...
- Django边学边记——中间件
特点 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,用于全局修改Django的输入或输出. 每个中间件组件负责做一些特定的功能.中间件全部注册在sett ...