系列文章:
FastAPI 學習之路(一)fastapi--高性能web開發框架
FastAPI 學習之路(十二)接口幾個額外信息和額外數據類型
FastAPI 學習之路(十三)Cookie 參數,Header參數
我們都知道,去創建請求體,更新數據我們用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 。
-
把數據保存至數據庫;
-
返回更新后的模型。
文章首發在公眾號,歡迎關注。