-
[Django] APIView를 이용한 views.py 리팩토링 1파이썬/Django 2023. 1. 11. 17:46728x90반응형
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'파이썬 > Django' 카테고리의 다른 글
[Django] APIView로 api 만들기 (0) 2023.01.13 [Django] Model View Sets 사용하기 (0) 2023.01.12 [Django] Rest 프레임워크로 [PUT] API 만들기 (feat. api_view, serializer) (0) 2023.01.10 [Django] Rest 프레임워크로 [POST] API 만들기 (feat. api_view, serializer) (0) 2023.01.09 [Django] Rest 프레임워크로 [GET] API 만들기 (feat. api_view, serializer) (0) 2023.01.08