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)