FastApi-09-模型嵌套

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战python

经常使用基础嵌套

使用 FastAPI,你能够定义、校验、记录文档并使用任意深度嵌套的模型(归功于 Pydantic)。markdown

基础模型

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None
    tags: list = []
复制代码

定义类型的字类型

假设咱们须要制定一个字段 tags:list 的元素都为 str 类型,怎么作呢?数据结构

答案是:使用 typing 中的 List 类。(指定其余字类型亦是如此)app

from typing import List

tags: List[str]
复制代码

如上,就定义了一个元素类型为 str 的列表。async

嵌套模型

为了方便组合拆解,咱们能够将某些模型对象单独声明,而后在其余模型中引用。ide

class Image(BaseModel):
    url: str
    name: str


class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None
    tags: Set[str] = []
    image: Optional[Image] = None
复制代码

如上,咱们定义了一个 Image 模型,在 Item 模型中直接使用了。post

在实际请求时,咱们按照如下格式发送请求体便可。测试

{
    "name": "Foo",
    "description": "The pretender",
    "price": 42.0,
    "tax": 3.2,
    "tags": ["rock", "metal", "bar"],
    "image": {
        "url": "http://example.com/baz.jpg",
        "name": "The Foo live"
    }
}
复制代码

特殊类型

HttpUrl:由 pydantic 提供。ui

class Image(BaseModel):
    url: HttpUrl
    name: str
复制代码

以上的使用方式,FastApi 支持自动联想补全,数据转换,数据校验,文档自动生成等。lua

实践

基础类型

class Md1(BaseModel):
    name:str
    age:int

@app.post('/model/1')
async def m1(md:Md1):
    return {'msg':'model is ok!'}
复制代码

执行测试:

测试结果

根据测试结果,咱们能够知道:①FastApi 的模型检验功能很好用。② 当整数被双引号包裹,FastApi 能够根据其限定的类型自动转换。③ 对于数据结构检验有明确的提示。

嵌套类型

class Md1(BaseModel):
    name:str
    age:int

class Md2(BaseModel):
    city_info:str
    people_info:Md1

@app.post('/model/1')
async def m1(md:Md1):
    return {'msg':'model is ok!'}

@app.put('/model/2')
async def m2(md:Md2):
    return {'msg':'relation model cheking pass!'}
复制代码

执行测试:

测试结果

根据以上测试结果,咱们能够清晰的了解到 FastApi 借助 pydantic 实现的模型嵌套很是优雅。模型嵌套结合动态请求体,咱们能够很方便的应对业务变化致使的数据模型变化。

感谢您的阅读,别忘了关注,点赞,评论,转发四连哟!

相关文章
相关标签/搜索