위의 그림으로 구분할 수 있으며 상속을 통해 진행된다고 생각하면 된다.
mixins는 우선 다양한 기능이 구현 되어있다.
CreateModelMixin
ListModelMixin
RetrieveModelMixin
UpdateModelMixin
DestroyModelMixin
이름만 봐도 굉장히 직관적으로 알 수 있음! Mixins를 사용하기 위해선 queryset과 serializer_class 미리 지정해주고 나머지는 Mixin과 연결해주기만 하면 된다.
class PostListMixins(mixins.ListModelMixin, mixins.CreateModelMixin,generics.GenericAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
def get(self, request, *args, **kwargs):
return self.list(request)
def post(self, request, *args, **kwargs):
return self.create(request)
class PostDetailMixins(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.delete(request, *args, **kwargs)
Mixin을 상속하며 반복되는 내용을 줄일 수 있지만 여러개를 상속해야하기에 가독성이 떨어지며, 이를 방지하기 위해 이를 다시 상속한 클래스가
generics APIView이며 이들을 총 9개의 클래스로 이루어져 있다.
generics.CreateAPIView : 생성
generics.ListAPIView : 목록
generics.RetrieveAPIView : 조회
generics.DestroyAPIView : 삭제
generics.UpdateAPIView : 수정
generics.RetrieveUpdateAPIView : 조회/수정
generics.RetrieveDestroyAPIView : 조회/삭제
generics.ListCreateAPIView : 목록/생성
generics.RetrieveUpdateDestroyAPIView : 조회/수정/삭제
종류가 많아서 뭔가 더 어려워보이지만 사실 기능적으로 함께 쓰일 수 있는 것들을 모아서 제공하기에 익숙해지면 더 편하게 사용할 수 있음
class PostListGenericAPIView(generics.ListCreateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
class PostDetailGenericAPIView(generics.RetrieveUpdateDestroyAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
이미 위의 generic, mixin으로도 코드가 간결해진 것을 볼 수 있지만 여전히 queryset과 serializer_class가 공통임에도 불구하고 따로 적고 있는 것을 확인할 수 있으며 이를 합친게 Viewset이다.
이를 보면 2개로 모든 것을 해결할 수 있음을 알 수 있다. 물론 viewset만 쓰면 되는게 아닌가란 생각이 들지만 많은 기능을 2가지로 만들었다는 것은 그만큼 하나하나가 무겁다는 의미!! 결국 잘 선택해서 써야함
Example
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
다음에 라우팅 하는 방법은 위와 조금 다릅니다.
Router 를 통해서 하나의 url 로 처리가 가능합니다.
from django.urls import path, include
from . import views
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('viewset',views.PostViewSet)
urlpatterns = [
path('',include(router.urls)),
]
참고