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 實現的模型嵌套很是優雅。模型嵌套結合動態請求體,咱們能夠很方便的應對業務變化致使的數據模型變化。

感謝您的閱讀,別忘了關注,點贊,評論,轉發四連喲!

相關文章
相關標籤/搜索