TIL120. DRF : mixins 상속을 통한 APIView

ID짱재·2022년 2월 13일
0

Django REST Framework

목록 보기
4/10
post-thumbnail

📌 이 포스팅에서는 DRF의 mixins 상속을 통한 APIView에 대해 정리하였습니다.



🌈 mixins 상속을 통한 APIView

🔥 mixins View

🔥 genrics APIView



1. mixins View

🤔 DRF에서 지원하는 mixins

✔️ 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이다.

🤔 PostListAPIView에서 mixins 사용 예시

✔️ 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)        

🤔 PostDetailAPIView에서 mixins 사용 예시

✔️ 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)              


2. genrics APIView

🤔 genrics APIView

✔️ 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 통합

🤔 genrics APIView를 사용하여 PostListAPIView 구현

✔️ 이에 위에 PostListAPIView는 generics APIView를 사용하면 아래와 같이 간결하게 구현 가능하다.

from rest_framework import generics
class PostListAPIView(generics.ListCreateAPIView):
    queryset = Post.object.all()
    serializer_class = PostSerializer

🤔 genrics APIView를 사용하여 PostDetailAPIView 구현

✔️ 위에 PostDetailAPIView를 generics APIView를 사용하면 아래와 같이 간결하게 구현 가능하다.

from rest_framework import generics
class PostDetailAPIView(generics.RetrieveUpdateDestoryAPIView):
    queryset = Post.object.all()
    serializer_class = PostSerializer
profile
Keep Going, Keep Coding!

0개의 댓글