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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM