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