[ FastAPI ] 바디 - 수정
PUT 을 사용한 대체를 위한 수정
아이템을 수정하기 위해 HTTP PUT 동작을 사용할 수 있습니다.
입력 데이터를 (예를 들어 NoSQL 데이터베이스와 사용하기 위해) JSON으로 저장될 수 있게 변환되도록 jsonable_encoder 를 사용할 수 있습니다. 예를 들어, datetime 을 str 로 변환하는 것입니다.
PUT 는 존재하는 데이터를 대체하는 데이터를 전달 받을 때 사용됩니다.
대체 관련 주의사항
이것은 만약 PUT 을 사용하여 아이템 bar 를 수정하고 싶을 때 바디에 포함되어야 할 것은 아래와 같습니다:
왜냐하면 이미 저장되어 있는 어트리뷰트 "tax": 20.2 는 포함하지 않고, 입력 모델은 기본 값 "tax": 10.5 을 취하기 때문입니다.
그리고 데이터에 "새로운" tax 의 값인 10.5 가 저장됩니다.
PATCH 를 사용한 부분 수정
HTTP PATCH 동작을 사용하여 부분적으로 데이터를 수정할 수 있습니다.
이것은 나머지는 온전하게 놔두고, 오로지 수정하고 싶은 데이터만 전송해야 하는 걸 의미합니다.
참고
PATCH 는 PUT 보다 덜 자주 사용되며 덜 알려져있습니다.
심지어 부분 수정을 할 때도, 많은 팀이 PUT 만 사용합니다.
FastAPI는 어떤 제약도 강요하지 않기 때문에, 원하는 대로 자유롭게 사용할 수 있습니다.
그러나 이 가이드는, 그것들이 어떻게 사용되도록 의도되었는지, 어느 정도 보여줍니다.
Pydantic의 exclude_unset 매개변수 사용
부분 수정본을 전달 받길 원한다면, Pydantic 모델의 .dict() 에 포함되어 있는 매개변수 exclude_unset 을 사용하는 게 유용합니다.
예를 들면 item.dict(exclude_unset=True) 와 같습니다.
item 모델을 만들 때 기본 값을 제외한, 집합인 데이터만을 사용하여 dict 을 생성합니다.
그러면 기본 값을 생략한, (요청 속에 전달 한) 집합인 데이터만을 dict 을 생성하는 데 사용할 수 있습니다:
Pydantic의 update 매개변수 사용
이제, .copy() 를 사용하여 존재하는 모델의 복사본을 생성할 수 있고 수정되어야 할 데이터를 포함하고 있는 dict 을 사용한 update 매개변수를 전달합니다.
예를 들면 stored_item_model.copy(update=update_data) 와 같습니다:
부분 수정 요약
요약하면, 부분 수정을 저용하기 위해:
- (마음 대로) PUT 대신 PATCH 를 사용합니다.
- 저장된 데이터를 검색합니다.
- Pydantic 모델에 데이터를 넣습니다.
- ( exclude_unset 를 사용하여) 입력 모델로부터 기본 값을 제외한 dict 을 생성합니다.
- 이 방법으로 모델 속에 기본 값을 사용하여 이미 저장되어 있는 값을 재정의하는 대신, 사용자에 의해 실제로 설정된 값만 수정할 수 있습니다.
- 저장된 모델의 복사본을 생성하고, ( update 매개변수를 사용하여) 전달 받은 부분 수정본을 사용한 어트리뷰트를 수정합니다.
- (예를 들어, jsonable_encoder 를 사용하여) 복사된 모델을 DB에 저장될 수 있게 변환합니다.
- 이것은 모델의 .dict() 메서드를 다시 사용하는 것과 호환되지만, 값을, 예를 들어, datetime 을 str 로 변환하듯, JSON으로 변환된 데이터 자료형으로 확실히 (또 변환) 해야 합니다.
- DB에 데이터를 저장합니다.
- 수정된 모델을 반환합니다.
팁
실제로 이것과 동일한 기술을 HTTP PUT 동작에도 사용할 수 있습니다.
그러나 여기에 있는 예시는 이러한 사용 사례를 위해 만들어졌기 때문에 PATCH 를 사용합니다.
참고
입력 모델은 여전히 유효해야 한다는 걸 명심하기 바랍니다.
따라서, 모둔 어트리뷰트가 생략될 수 있는 부분 수정본을 전달 받고 싶다면, (기본 값 또는 None 을 사용하는) 선택사항이라 표시되어 있는 모든 어트리뷰트를 사용한 모델을 갖고있어야 합니다.
수정을 위해 모든 선택적 값을 가진 모델과 생성을 위해 필수적으로 요구되는 값을 가진 값을 구분하기 위해, 추가 모델에 설명된 개념을 사용할 수 있습니다.
원문
'FastAPI > Tutorial - User Guide' 카테고리의 다른 글
[ FastAPI ] 의존성으로서의 클래스 (0) | 2021.10.19 |
---|---|
[ FastAPI ] 의존성 - 첫 단계 (0) | 2021.10.06 |
[ FastAPI ] JSON 호환 부호화 (0) | 2021.10.03 |
[ FastAPI ] 경로 동작 구성 (0) | 2021.10.01 |
[ FastAPI ] 오류 처리 (0) | 2021.09.30 |