본문 바로가기
FrameWork/Django

DRF APIView

by mansoorrr 2024. 7. 18.

앞서 Django Rest Framework를 통해 GET, POST, PUT, DELETE를 다뤘다.

모두 함수를 만들어 진행했고, @api_view 데코레이터를 통해 request method를 적용시켰다.

함수 안에 if, else등과 같은 코드들이 많이 들어감을 알 수 있었다.

 

이것을 좀 더 보기 좋게 구조화 시키기 위해 APIView를 활용해 클래스화 한다.

 

 

[** APIView **]

  • django.rest_framework.APIView 를 상속
  • 클래스 안에 request method에 해당하는 함수들을 만듬
  • 세부적인 변수가 필요할 경우에는 get_object()함수를 만들어 적용(관습)
#---------- categories/views.py 변경 전

@api_view(['GET', 'PUT', 'DELETE'])
def categoryDetail(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)
        
    elif request.method == 'DELETE':
        category.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)        


            

#---------- categories/views.py 변경 후
from rest_framwork import APIView


class CategoryDetail(APIView):
	
    #----- category 변수 만들기
    def get_object(self, category_pk):
        try:
            category = Category.objects.get(pk=category_pk) #카테고리 검색
        except Category.DoesNotExist:
            raise NotFound
        return category

	#----- get, put, delete(request method들 함수화)
    def get(self, request, category_pk):
        serializer = CategorySerializer(self.get_object(category_pk))
        return Response(serializer.data)

    def put(self, request, category_pk):
        category = self.get_object(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)

    def delete(self, request, category_pk):
        self.get_object(category_pk).delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

 

 

'FrameWork > Django' 카테고리의 다른 글

DB transaction  (0) 2024.07.20
DRF Serializer  (0) 2024.07.18
DRF UPDATE * DELETE  (0) 2024.07.18
DRF POST & validate & save  (1) 2024.07.18
DRF(Django Rest Framework)  (0) 2024.07.17