1. 程式人生 > 其它 >FastAPI 學習之路(十一)請求體 - 巢狀模型

FastAPI 學習之路(十一)請求體 - 巢狀模型

系列文章:

  FastAPI 學習之路(一)fastapi--高效能web開發框架

  FastAPI 學習之路(二)

  FastAPI 學習之路(三)

  FastAPI 學習之路(四)

  FastAPI 學習之路(五)

FastAPI 學習之路(六)查詢引數,字串的校驗

  FastAPI 學習之路(七)字串的校驗

 FastAPI 學習之路(八)路徑引數和數值的校驗

  FastAPI 學習之路(九)請求體有多個引數如何處理?

  FastAPI 學習之路(十)請求體的欄位

還是之前的例子,我們現在書有這樣的一個屬性,在哪裡出售。我們需要增加這樣的一個欄位,而且書的可以銷售的地方是多個的,那麼我們應該如何實現呢。

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之類的校驗。

文章首發在公眾號,歡迎關注。