GenericAPIView로 CRUD를 구현한 코드를 보자.
# views.py
from rest_framework import generics
from .models import Quiz
from .serializers import QuizSerializer
class QuizListCreateView(generics.ListCreateAPIView):
queryset = Quiz.objects.all()
serializer_class = QuizSerializer
class QuizRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
queryset = Quiz.objects.all()
serializer_class = QuizSerializer
# urls.py
from django.urls import path
from .views import QuizListCreateView, QuizRetrieveUpdateDestroyView
urlpatterns = [
path("", QuizListCreateView.as_view()),
path("<int:pk>/", QuizRetrieveUpdateDestroyView.as_view()),
]
queryset과 serializer_class를 정의하는 부분이 중복된다. ViewSet은 이를 통합한다.
ViewSet을 이용한 코드는 다음과 같다. urls.py에서 라우팅 하는 부분 또한 다름에 유의하자.
# views.py
from rest_framework import viewsets
from .models import Quiz
from .serializers import QuizSerializer
class QuizViewSet(viewsets.ModelViewSet):
queryset = Quiz.objects.all()
serializer_class = QuizSerializer
# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import QuizViewSet
router = DefaultRouter()
router.register('', QuizViewSet)
urlpatterns = [
path("", include(router.urls)),
]
이제 중복 코드가 없다. CRUD는 위처럼 ViewSet으로 간단하게 구현할 수 있다.