FastAPI 學習之路(十一)請求體 - 巢狀模型
阿新 • • 發佈:2021-10-17
系列文章:
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 importBody, 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之類的校驗。
文章首發在公眾號,歡迎關注。