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 学习之 ...
随机推荐
- 手机端rem简单配置相关
手机端rem简单配置相关 1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 ...
- MySQL-SQL基础-查询2
mysql> create table customer(mid char(5) primary key,th date,sex char(1) default '0'); Query OK, ...
- centos7 wget安装jdk
2021-07-151. 环境介绍 操作系统:centos7 jdk版本:jdk1.8.0.211 2. 下载 进入 https://www.oracle.com/java/technologies/ ...
- MyBatis学习总结(一)——MyBatis入门学习
一.MyBatis 简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可 ...
- Shiro02
Shiro认证 Pom依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>s ...
- Git 系列教程(13)- 分支管理
查看分支列表 $ git branch iss53 * master testing 注意 master 分支前的 * 字符:它代表现在 checkout 的那一个分支(也就是说,当前 HEAD 指 ...
- 为什么要设置GOROOT/GOPATH
设置GOROOT的原因 编译器的位置指定的时候,需要指定GO开发包的安装位置,然后设置环境变量PATH的时候,需要指定到安装包下的bin目录,其中就有以下的编译/执行器.所以GOROOT指定了前面的路 ...
- undefined和null
undefined和null undefined的情景: 声明变量为赋值 var name; console.og(name); //undefined 访问对象上不存在的属性 var obj={} ...
- 洛谷P1094——纪念品分组(简单贪心)
https://www.luogu.org/problem/show?pid=1094 题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均 ...
- 【多线程】Android多线程学习笔记——线程池
Java线程池采用了享元设计模式,在系统中维持一定数量的线程,用于处理异步或并发需求,在平时处理异步或并发任务时被广泛使用.这里基于JDK1.8和Android28来整理一些关于线程池的知识点. 一. ...