FastAPI-14:Pydantic Model


FastAPI-14:Pydantic Model

有类型参数的字段

Python有一种特定的方法来声明具有内部类型或类型参数的列表

其实前面都见过,就是

List[str]
Set[str]
Tuple[str]
Dict[str]

在Pydantic Model中使用typing提供的类型

from typing import List, Optional, Set, Dict, Tuple
from pydantic import BaseModel
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None
    tags: List[str] = []
    address: Set[str] = set()
    phone: Tuple[int] = ()
    ext: Dict[str, str] = {}
item = Item(name="刘星星", price=12.2)
print(dict(item))
# 程序输出结果
# >>> {'name': '刘星星', 'description': None, 'price': 12.2, 'tax': None, 'tags': [], 'address': set(), 'phone': (), 'ext': {}}

Pydantic嵌套模型

from typing import List
from pydantic import BaseModel
# 模型 1
class Foo(BaseModel):
    count: int
    size: float = None
# 模型 2
class Bar(BaseModel):
    apple: Optional[str] = 'x'
    banana: Optional[str] = 'y'
# 模型 3
class Spam(BaseModel):    
   # 字段类型是 Pydantic Model,这就是嵌套模型
    foo: Foo
    bars: List[Bar]
f = Foo(count=2)
b = Bar()
s = Spam(foo=f, bars=[b])
print(dict(s))
# 上述程序执行结果
# >>> {'foo': Foo(count=2, size=None), 'bars': [Bar(apple='x', banana='y')]}

FastAPI中使用Pydantic嵌套模型

# 模型一
class Image(BaseModel):
    url: str
    name: str


# 模型二
class Items(BaseModel):
    name: str
    price: float
    description: Optional[str] = None
    tags: Set[str] = set()
    # Image 模型组成的列表类型
    image: Optional[List[Image]] = None


@router.post("/items/{item_id}")
async def update_item(
        item_id: int,
        # 声明类型为:嵌套模型的 Item
        item: Items
):
    results = {"item_id": item_id, "item": item}
    return results

期望得到的请求体

{
  "name": "string",
  "price": 0,
  "description": "string",
  "tags": [],
  "image": [
    {
      "url": "string",
      "name": "string"
    }
  ]
}

重点

tags 虽然声明为 Set(),但在接口层面并没有集合这个概念,所以还是传数组 [ ] 格式哦,并不是传 { } 哦。但是!集合的特性仍然会保留:**去重**

FastAPI给嵌套模式提供的功能

和前面讲的没什么区别

  • IDE 智能代码提示,甚至对于嵌套模型也支持
  • 数据转换
  • 数据验证
  • OpenAPI 文档

正确传参结果

如上:第二个框中的内容将“标签1”去重了。

校验失败的请求结果

查看Swagger API文档

深层次嵌套模型

# 模型一
class Image(BaseModel):
    url: str
    name: str


# 模型二
class Items(BaseModel):
    name: str
    price: float
    description: Optional[str] = None
    tags: Set[str] = set()
    # Image 模型组成的列表类型
    image: Optional[List[Image]] = None


# 模型三
class Offer(BaseModel):
    name: str
    description: Optional[str] = None
    items: List[Items]


@router.post("/offers/")
async def create_offer(offer: Offer):
    return offer

期望得到的请求体

{
    "name": "string",
    "description": "string",
    "items": [
        {
            "name": "string",
            "price": 0,"tags": [],
            "images": [
                {
                    "url": "string",
                    "name": "string"
                }
            ]
        }
    ]
}

正确传参的请求结果

IDE提供的智能提示

即使是三层嵌套模型,也可以拥有丝滑般的代码提示哦!!!


文章作者: 刘宇亭
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 刘宇亭 !
评论
  目录