📌 이 포스팅에서는 DRF의 mixins 상속을 통한 APIView에 대해 정리하였습니다.
🔥 mixins View
🔥 genrics APIView
✔️ DRF에서 지원하는 mixins는 실제 python에서 제공하는 mixins 문법이 없기 때문에 python 클래스의 상속 문법을 활용한다.
✔️ 아래 5가지 mixins를 모듈로써 제공한다.
- CreateModlMixin : post 요청 받았을 때, 생성할 때 create하는 로직
- ListModelMixin : get 요청 받앗을 때, 목록 조회
- RetrieveModelMixin : get 요청 받았을 때, 상세 보기 조회
- UpdateModelMixin : put 또는 patch 요청 받았을 때, 수정
- DestroyModelMixin : delete 요청 받았을 때, 삭제
✔️ DRF에서 가장 기본인 View는 View를 상속받은 APIView이다. 이를 좀더 패턴화한 것이 mixins이고, mixins 문버을 더 간결하고 통합시킨것이 Generics이다. 마지막으로 하나의 클래스에서 여러 url을 처리할 수 있도록 Generics를 더 간결하게 추상화시킨 것이 ViewSet이다.
✔️ method별 로직 연결은 mixins 다음에 genric 클래스를 상속받아야 한다. 이를 MRO라는 호출 순서라 한다.
✔️ 아래처럼 매번 method를 직접 연결해주어야하기 때문에 번거롭다는 단점이 있다.
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): # 👈 get method 연결 return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): # 👈 post method 연결 return self.create(request, *args, **kwargs)
✔️ DetailAPIView 에서는 상세보기, 수정, 삭제가 이뤄집니다. 이를 위해 3개의 mixin을 상속 받습니다.
✔️ 이 또한 각 각의 매서드를 연결시켜주어야하기 때문에 번거롭습니다.
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): # 👈 get method 연결 return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs): # 👈 put method 연결 return self.update(request, *args, **kwargs) def put(self, request, *args, **kwargs): # 👈 delete method 연결 return self.destroy(request, *args, **kwargs)
✔️ genrics APIView는 위의 GenercisAPIView를 상속받아 좀 더 편하게 mixin 기능을 사용하는 클래스이다.
✔️ genrics APIView의 종류는 아래와 같다.
- generics.CreateAPIView : post 요청일 때, create의 매핑되어 object 생성
- generics.ListAPIView : get 요청일 때, list와 매핑되어 object list 제공
- generics.RetrieveAPIView : get 요청일 때, retrieve와 매핑되어 object 상세 정보 제공
- generics.DestroyAPIView : delete 요청일 때, destory와 매핑되어 object 삭제
- generics.UpdateAPIView : put 요청일 때는 update, patch 요청일 때는 partial_update와 매핑
- generics.ListCreateAPIView : CreateAPIView와 ListAPIView를 통합
- generics.RetrieveUpdateAPIView : RetrieveAPIView와 UpdateAPIView를 통합
- generics.RetrieveDestoryAPIView : RetrieveAPIView와 DestroyAPIView를 통합
- generics.RetrieveUpdateDestroyAPIView : RetrieveAPIView, UpdateAPIView, DestroyAPIView 통합
✔️ 이에 위에 PostListAPIView는 generics APIView를 사용하면 아래와 같이 간결하게 구현 가능하다.
from rest_framework import generics class PostListAPIView(generics.ListCreateAPIView): queryset = Post.object.all() serializer_class = PostSerializer
✔️ 위에 PostDetailAPIView를 generics APIView를 사용하면 아래와 같이 간결하게 구현 가능하다.
from rest_framework import generics class PostDetailAPIView(generics.RetrieveUpdateDestoryAPIView): queryset = Post.object.all() serializer_class = PostSerializer