Programming Language/Python

[FastAPI] 12. Update: PUT, PATCH

LeeJaeJun 2024. 6. 20. 23:16
728x90
반응형

PUT, PATCH

  • PUT 요청은 전체 객체를 대체하는 데 사용
    • 클라이언트가 전체 객체를 제공하여 서버에 저장된 기존 객체를 완전히 대체
@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
  • PATCH 요청은 부분 업데이트에 사용
    • 클라이언트가 업데이트하려는 필드만 제공하고, 나머지 필드는 그대로 유지
    • exclude_unset 옵션
      • True로 설정 시: Pydantic 모델에서 설정되지 않은 기본값을 제외한 데이터를 처리
        • 기본값으로 설정된 필드 값들을 요청 본문에서 제공되지 않은 필드 값으로 간주하여 업데이트에서 제외하는 것을 의미
        • 이를 통해 PUT 요청에서도 부분 업데이트를 수행할 수는 있음(일반적이지는 않음)(PATCH를 쓰는 것이 일반적)
          • 전체 데이터를 교체하는 용도로 사용되지만, exclude_unset=True를 사용하여 부분 업데이트 수행은 가능
      • False(기본값)로 설정 시: Pydantic 모델에서 명시적으로 제공되지 않은 필드들이 기본값으로 대체
        • 기존 데이터가 있더라도 기본값이 설정된 필드는 해당 기본값으로 바뀜
@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) # 기존 데이터를 기반으로 Pydantic 모델 인스턴스를 생성
    update_data = item.dict(exclude_unset=True) #  클라이언트로부터 받은 데이터를 딕셔너리로 변환하되, 기본값은 제외
    updated_item = stored_item_model.copy(update=update_data) # 기존 모델의 복사본을 만들고, 받은 데이터를 사용하여 업데이트
    items[item_id] = jsonable_encoder(updated_item) # 업데이트된 데이터를 JSON 호환 형태로 변환하여 저장
    # 업데이트된 데이터를 데이터베이스에 넣는 처리를 하면 실제 데이터베이스에도 반영
    return updated_item

 

728x90
반응형