FrameWork/Django
DRF UPDATE * DELETE
mansoorrr
2024. 7. 18. 11:35
[** UPDATE **]
- 기본 구조는 post와 동일
- method=put
- serializer를 만들때 기존의 데이터와, 입력받은 데이터를 모두 넣어줌
- 수정의 특징상 부분 수정이 있을 수 있으므로 partial=True로 지정
- 수정 후 serializer.save()를 실행하면 뒤에서 update매서드가 호출됨
#---------- categories/serializers.py
class CategorySerializer(serializers.Serializer):
pk = serializers.IntegerField(read_only=True)
name = serializers.CharField()
kind = serializers.ChoiceField(
choices=Category.CategoryKindChoice.choices,
)
created_at = serializers.DateTimeField(read_only=True)
def create(self, validated_data):
return Category.objects.create(**validated_data)
def update(self, instance, validated_data):
#부분수정 가능하도록 dict의 get함수 적용
instance.name = validated_data.get('name', instance.name)
instance.kind = validated_data.get('kind', instance.kind)
instance.save()
return instance
#---------- categories/views.py
@api_view(['GET', 'PUT'])
def category(request, category_pk):
try:
category = Category.objects.get(pk=category_pk) #카테고리 검색
except Category.DoesNotExist:
raise NotFound
if request.method == "GET":
serializer = CategorySerializer(category)
return Response(serializer.data)
elif request.method == "PUT":
category = Category.objects.get(pk=category_pk)
serializer = CategorySerializer(
category, #기존데이터
data=request.data, #변경할 데이터
partial=True, #부분변경
)
if serializer.is_valid():
updated_category = serializer.save() #update 호출
return Response(CategorySerializer(updated_category).data)
else:
return Response(serializer.errors)
[** DELETE **]
- method에 delete적기
- elif request.method=="DELETE": category.delete()
elif request.method == 'DELETE':
category.delete()
return Response(status=status.HTTP_204_NO_CONTENT)