FastAPI 學習之路(二十一)請求體 - 更新資料
阿新 • • 發佈:2021-10-18
系列文章:
FastAPI 學習之路(一)fastapi--高效能web開發框架
FastAPI 學習之路(十二)介面幾個額外資訊和額外資料型別
FastAPI 學習之路(十三)Cookie 引數,Header引數
我們都知道,去建立請求體,更新資料我們用PUT請求,我們去試著更新下資料。
我們有一組資料,我們要更新描述。
from typing import List, Optional fromfastapi 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。
-
把資料儲存至資料庫;
-
返回更新後的模型。
文章首發在公眾號,歡迎關注。