ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] APIView를 이용한 views.py 리팩토링 1
    파이썬/Django 2023. 1. 11. 17:46
    728x90
    반응형

    APIView로 views.py 리팩토링하기

     

    먼저 APIView를 import 해준다.

    from rest_framework.views import APIView

     

    원래 있던 @api_view()와 함수를 갖다버리고 클래스를 생성한다.

    class Categories(APIView):
        
        # 모든 메소드는 항상 self 인자를 받아야 함
        def get(self, request):
            all_categories = Category.objects.all()
            serializer = CategorySerializer(all_categories, many=True)
            return Response(serializer.data)
        
        def post(self, request):
            serializer = CategorySerializer(data=request.data)
            if serializer.is_valid():
                new_category = serializer.save()
                return Response(
                    CategorySerializer(new_category).data,
                )
            else:
                return Response(serializer.errors)

    클래스 인자로 APIView를 받는다.

    GET과 POST 등 메소드를 if ... elif로 지저분하게 받던 걸 클래스 내 메소드로 받아준다.

     
    리팩토링 후에는 categories/urls.py 를 수정해줘야 하는데 함수 대신 클래스를 호출해준다.
    from django.urls import path
    from . import views
    
    urlpatterns = [
        # 클래스로 수정했기 때문에
        # 클래스를 호출한 뒤 as_view()를 호출해야 한다. (그냥 규칙임)
        path("", views.Categories.as_view()),
        path("<int:pk>", views.CategoryDetail.as_view()),
    ]

    그리고 .as_view()를 호출해준다. (그냥 규칙임)

     


    전체코드

    📁 categories/views.py

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework.exceptions import NotFound
    from rest_framework.status import HTTP_204_NO_CONTENT
    from .models import Category
    from .serializers import CategorySerializer
    
    # 인자로 APIView를 받는다
    class Categories(APIView):
        
        # 모든 메소드는 항상 self 인자를 받아야 함
        def get(self, request):
            all_categories = Category.objects.all()
            serializer = CategorySerializer(all_categories, many=True)
            return Response(serializer.data)
        
        def post(self, request):
            serializer = CategorySerializer(data=request.data)
            if serializer.is_valid():
                new_category = serializer.save()
                return Response(
                    CategorySerializer(new_category).data,
                )
            else:
                return Response(serializer.errors)
        
    class CategoryDetail(APIView):
    	# 수정하려는 기존 오브젝트를 찾는 함수
        def get_object(self, pk):
            try:
                return Category.objects.get(pk=pk)
            except Category.DoesNotExist:
                raise NotFound
        def get(self, request, pk):
            serializer = CategorySerializer(self.get_object(pk))
            return Response(serializer.data)
        
        def put(self, request, pk):
            serializer = CategorySerializer(
                self.get_object(pk),
                data=request.data,
                partial=True,
            )
            if serializer.is_valid():
                updated_category = serializer.save()
                return Response(CategorySerializer(updated_category).data)
            else:
                return Response(serializer.errors)
            
        def delete(self, request, pk):
            self.get_object(pk).delete()
            category.delete()
            return Response(status=HTTP_204_NO_CONTENT)
    LIST
Designed by Tistory.