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)