[FastAPI Docs] Body - Updates

JeongChaeJin·2022년 9월 1일
0
from typing import List, Union

from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: Union[str, None] = None
    description: Union[str, None] = None
    price: Union[float, None] = None
    tax: float = 10.5
    tags: List[str] = []


items = {
    "foo": {"name": "Foo", "price": 50.2},
    "bar": {"name": "Bar", "description": "The bartenders", "price": 62, "tax": 20.2},
    "baz": {"name": "Baz", "description": None, "price": 50.2, "tax": 10.5, "tags": []},
}


@app.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: str):
    return items[item_id]


@app.put("/items/{item_id}", response_model=Item)
async def update_item(item_id: str, item: Item):
    update_item_encoded = jsonable_encoder(item)
    items[item_id] = update_item_encoded
    return update_item_encoded
  • PUT은 존재하고있는 데이터를 replace할 때 사용한다.
{
    "name": "bar",
    "price": 3,
    "description": None,
}
  • bar를 위처럼 바꿔보려고 했을 때, tax가 20.2로 저장되어있는데, 위 코드처럼 바꾸면, default로 10.5 값이 지정되어있어서 이걸로 대체되어 버린다;;

Partial updates with PATCH

  • patch는 put보다 덜 쓰이지만 partial update를 명시하기 좋다.
    • 오직 원하는 데이터만 보낸다는 것을 의미한다.

Using Pydantic's exclude_unset parameter

  • Pydantic model의 dict 함수에서 exclude_unset 파라미터가 유용하다.
    • item.dict(exclude_unset=True)
    • default 값들을 제외해서 dict가 생성된다.
    • 이를 사용하면 set하고 싶은 data만 생성할 수 있게 된다.
from typing import List, Union

from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: Union[str, None] = None
    description: Union[str, None] = None
    price: Union[float, None] = None
    tax: float = 10.5
    tags: List[str] = []


items = {
    "foo": {"name": "Foo", "price": 50.2},
    "bar": {"name": "Bar", "description": "The bartenders", "price": 62, "tax": 20.2},
    "baz": {"name": "Baz", "description": None, "price": 50.2, "tax": 10.5, "tags": []},
}


@app.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: str):
    return items[item_id]


@app.patch("/items/{item_id}", response_model=Item)
async def update_item(item_id: str, item: Item):
    stored_item_data = items[item_id]
    stored_item_model = Item(**stored_item_data)
    update_data = item.dict(exclude_unset=True)
    updated_item = stored_item_model.copy(update=update_data)
    items[item_id] = jsonable_encoder(updated_item)
    return updated_item

Using Pydantic's update parameter

  • 존재하고 있던 model을 copy하고 update parameter를 전달시킨다.
  • updated_item = stored_item_model.copy(update=update_data)
profile
OnePunchLotto

0개의 댓글