
상속받는 클래스의 추상화(패턴화) 정도 한눈에 알아보기
- APIView < mixins < generics APIView < ViewSet
- APIView : 자주 쓰이는 view 들의 패턴을 패턴화 시켜 최소한의 코드로 Model 에 대한 view 를 구현하는 방법.
- mixins : APIView 의 일반적인 로직들을 섞어 재사용성을 높임.
- generics APIView : mixins 사용을 패턴화하여 정리.
- ViewSet : generics APIViews 를 한번 더 합쳐서 정리.
APIView는 각 request method 마다 직접 serializer 처리를 해주어야되는데, 이러한 부분들이 많이 사용되면 여러 serializer에 대한 중복이 발생합니다. 따라서 rest_framework.mixins 에서는 이러한 기능들이 미리 구현이 되어 있습니다.
urlpatterns = [
생략...
path("categories/", MixinsCategories.as_view()),#dev_52
path("categories/<int:pk>/", MixinsCategory.as_view()),#dev_52
]
#dev_52
class MixinsCategories(ListModelMixin,CreateModelMixin,DestroyModelMixin,GenericAPIView):
queryset = Category.objects.all()
serializer_class = CategorySerializer
def get(self, request, *args, **kwargs):
return self.list(request)
def post(self, request, *args, **kwargs):
return self.create(request)
class MixinsCategory(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
queryset = Category.objects.all()
serializer_class = CategorySerializer
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.destroy(request, *args, **kwargs)

# APIView
from rest_framework.views import APIView
class SnippetsAPIView(APIVIEW):
def get(self, request):
pass
def post(self, request):
pass
# Mixins
from rest_framework import mixins
RetrieveModelMixin : Get
ListModelMixin : Gets
CreateModelMixin : Post
UpdateModelMixin : Put
DestroyModelMixin : delete
# Generics APIView
from rest_framework import generics
generics.CreateAPIView : 생성
generics.ListAPIView : 목록
generics.RetrieveAPIView : 조회
generics.DestroyAPIView : 삭제
generics.UpdateAPIView : 수정
generics.RetrieveUpdateAPIView : 조회/수정
generics.RetrieveDestroyAPIView : 조회/삭제
generics.ListCreateAPIView : 목록/생성
generics.RetrieveUpdateDestroyAPIView : 조회/수정/삭제
# ViewSets - Router 사용해야함
from rest_framework import viewsets
viewsets.ReadOnlyModelViewSet : 목록 조회, 특정 레코드 조회 (get만 가능)
viewsets.ModelViewSet : 목록 조회, 특정 레코드 생성/조회/수정/삭제 전부 자동으로 만들어줌.
Viewsets.ViewSet : 자동으로 만들지마! 내가 다 만들께
urls.py
from rest_framework.routers import DefaultRouter
post_router = DefaultRouter()
post_router.register('viewset',views.PostViewSet)
출처: https://jongseoung.tistory.com/220 [Today_developStory:티스토리]