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 。

  • 把數據保存至數據庫;

  • 返回更新后的模型。

 

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

 


免責聲明!

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



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