Backend/Django

[django-rest-framework] (6) mixins / generics APIView

dltjdn 2022. 1. 21. 17:37

DRF에서 지원하는 mixins

  • CreateModelMixin
  • ListModelMixin
  • RetrieveModelMixin
  • UpdateModelMixin
  • DestroyModelMixin

Method별로 로직 연결

from rest_framework import generics
from rest_framework import mixins

# GenericAPIView가 무조건 맨 뒤에 와야함
class PostListAPIView(mixins.ListModelMixin, mixins.CreateModelMixin,
						generics.GenericAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    def get(self, request, *args, **kwargs ):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs ):
        return self.create(request, *args, **kwargs)

# GenericAPIView가 무조건 맨 뒤에 와야함
class PostDetailAPIView(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.destroy(request, *args, **kwargs)

매번 위와 같이 하나하나 매핑하려니 번거롭다 → 이런것들을 패턴화한 것이 generics APIView

 

APIView에서 일반적인 로직들을 정리해서 mixin으로 재사용성 높이고 이것들을 좀 더 패턴화 한 것이 generics이며 이것을 더 정리한 것이 Viewset이다 ( APIView mixins Generics Viewset )

 

 

여러 generics APIView ← 모두 GenericsAPIView 상속

 

자동으로 매핑해준다

  • generics.CreateAPIView : post → create
  • generics.ListAPIView : get → list
  • generics.RetrieveAPIView : get → retrieve
  • generics.DestroyAPIView : delete → destroy
  • generics.UpdateAPIView : put → update,  patch → partial_update
  • generics.ListCreateAPIView : get → list,  post → create
  • generics.RetrieveUpdateAPIView : get → retrieve, put → update, patch → partial_update
  • generics.RetrieveDestroyAPIView : get →  retrieve, delete → destory
  • generics.RetrieveUpdateDestroyAPIView : get → retrieve, put → update, patch → partial_update, delete → destroy

 

generic APIView 사용 예시

from rest_framework import generics
from rest_framework import mixins

class PostListAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    def get(self, request, *args, **kwargs ):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs ):
        return self.create(request, *args, **kwargs)



# 위와 똑같은 내용을 generic APIView 사용해 구현
class postListAPIView(generics.ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

 

from rest_framework import generics
from rest_framework import mixins


class PostDetailAPIView(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.destroy(request, *args, **kwargs)
        
        
        
# 위와 똑같은 내용을 generic APIView 사용해 구현
class PostDetailAPIView(generics.RetrieveUpdataeDestroyAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer