1. 程式人生 > 其它 >FastAPI 學習之路(二十一)請求體 - 更新資料

FastAPI 學習之路(二十一)請求體 - 更新資料

 系列文章:

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

  FastAPI 學習之路(二)

  FastAPI 學習之路(三)

  FastAPI 學習之路(四)

  FastAPI 學習之路(五)

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

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

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

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

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

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

  FastAPI 學習之路(十二)介面幾個額外資訊和額外資料型別

FastAPI 學習之路(十三)Cookie 引數,Header引數

  FastAPI 學習之路(十四)響應模型

  FastAPI 學習之路(十五)響應狀態碼

  FastAPI 學習之路(十六)Form表單

FastAPI 學習之路(十七)上傳檔案

FastAPI 學習之路(十八)表單與檔案

  FastAPI 學習之路(十九)處理錯誤

FastAPI 學習之路(二十)介面文件配置相關

我們都知道,去建立請求體,更新資料我們用PUT請求,我們去試著更新下資料。

我們有一組資料,我們要更新描述。

from typing import List, Optional
from
fastapi import FastAPI from fastapi.encoders import jsonable_encoder from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: Optional[str] = None description: Optional[str] = None price: Optional[float] = None tax: float = 10.5 tags: List[str] = [] items = {
"one": {"name": "蘋果", "price": 50.2} } @app.put("/items/", response_model=Item) def update_item(name: str, item: Item): update_item_encoded = jsonable_encoder(item) items[name] = update_item_encoded return update_item_encoded @app.get("/items/{item_id}", response_model=Item) def read_item(item_id: str): return items[item_id]

我們去獲取下

我們去更新下資料

我們去更新一個不存在的資料

更新部分資料時,可以在 Pydantic 模型的.dict()中使用exclude_unset引數。

比如,item.dict(exclude_unset=True)。我們去看我們實際的例子

from typing import List, Optional
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
    name: Optional[str] = None
    description: Optional[str] = None
    price: Optional[float] = None
    tax: float = 10.5
    tags: List[str] = []
items = {
    "one": {"name": "蘋果", "price": 50.2}
}
@app.put("/items/", response_model=Item)
def update_item(name: str, item: Item):
    stored_item_data = items[name]
    stored_item_model = Item(**stored_item_data)
    update_data = item.dict(exclude_unset=True)
    updated_item = stored_item_model.copy(update=update_data)
    items[name] = jsonable_encoder(updated_item)
    return updated_item
@app.get("/items/{item_id}", response_model=Item)
def read_item(item_id: str):
    return items[item_id]

我們去看下去後的效果

更新部分資料小結

簡而言之,更新部分資料做法:

  • 使用PUT也可以使用PATCH;

  • 提取儲存的資料;

  • 把資料放入 Pydantic 模型;

  • 生成不含輸入模型預設值的dict(使用exclude_unset引數);

    • 只更新使用者設定過的值,不用模型中的預設值覆蓋已儲存過的值。

  • 為已儲存的模型建立副本,用接收的資料更新其屬性 (使用update引數)。

  • 把模型副本轉換為可存入資料庫的形式(比如,使用jsonable_encoder)。

    • 這種方式與 Pydantic 模型的.dict()方法類似,但能確保把值轉換為適配 JSON 的資料型別,例如, 把datetime轉換為str。

  • 把資料儲存至資料庫;

  • 返回更新後的模型。

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