Django views

mkhome·2021년 5월 28일
0

django

목록 보기
1/6

시작하며

  • 회사에서 사용하는 백엔드는 django로 당연히 rest-framework를 사용하고 있다. 그와 함께 당연히 viewsets을 사용하고 있는데 매번 머리로 정리는 하지만 기억하기 위해 이번에 정리를 시작

view의 종류


위의 그림으로 구분할 수 있으며 상속을 통해 진행된다고 생각하면 된다.

APIView

  • CBV(class)의 하나이기에 하나의 URL에 대해서만 처리할 수 있다. 이후 각 클래스에 대해 as_view로 라우팅을 해준다. 또한 각 request마다 직접 serializer 처리를 해줘야한다.(굉장히 불편), 가장 기초적인 view라고 볼 수 있다.

Mixins 상속

  • mixins는 우선 다양한 기능이 구현 되어있다.
    CreateModelMixin
    ListModelMixin
    RetrieveModelMixin
    UpdateModelMixin
    DestroyModelMixin
    이름만 봐도 굉장히 직관적으로 알 수 있음! Mixins를 사용하기 위해선 queryset과 serializer_class 미리 지정해주고 나머지는 Mixin과 연결해주기만 하면 된다.

    예시

    class PostListMixins(mixins.ListModelMixin, mixins.CreateModelMixin,generics.GenericAPIView):
        queryset = Post.objects.all()
        serializer_class = PostSerializer
    
          def get(self, request, *args, **kwargs):
              return self.list(request)
    
          def post(self, request, *args, **kwargs):
              return self.create(request)
        
    class PostDetailMixins(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.delete(request, *args, **kwargs)

generics APIView

  • Mixin을 상속하며 반복되는 내용을 줄일 수 있지만 여러개를 상속해야하기에 가독성이 떨어지며, 이를 방지하기 위해 이를 다시 상속한 클래스가

    generics APIView이며 이들을 총 9개의 클래스로 이루어져 있다.
    generics.CreateAPIView : 생성
    generics.ListAPIView : 목록
    generics.RetrieveAPIView : 조회
    generics.DestroyAPIView : 삭제
    generics.UpdateAPIView : 수정
    generics.RetrieveUpdateAPIView : 조회/수정
    generics.RetrieveDestroyAPIView : 조회/삭제
    generics.ListCreateAPIView : 목록/생성
    generics.RetrieveUpdateDestroyAPIView : 조회/수정/삭제

    종류가 많아서 뭔가 더 어려워보이지만 사실 기능적으로 함께 쓰일 수 있는 것들을 모아서 제공하기에 익숙해지면 더 편하게 사용할 수 있음

    class PostListGenericAPIView(generics.ListCreateAPIView):
        queryset = Post.objects.all()
        serializer_class = PostSerializer
    
    class PostDetailGenericAPIView(generics.RetrieveUpdateDestroyAPIView):
        queryset = Post.objects.all()
        serializer_class = PostSerializer

Viewset

  • 이미 위의 generic, mixin으로도 코드가 간결해진 것을 볼 수 있지만 여전히 queryset과 serializer_class가 공통임에도 불구하고 따로 적고 있는 것을 확인할 수 있으며 이를 합친게 Viewset이다.

    • viewsets.ReadOnlyModelViewSet : 목록 조회, 특정 레코드 조회
    • viewsets.ModelViewSet : 목록 조회, 특정 레코드 생성/조회/수정/삭제
  • 이를 보면 2개로 모든 것을 해결할 수 있음을 알 수 있다. 물론 viewset만 쓰면 되는게 아닌가란 생각이 들지만 많은 기능을 2가지로 만들었다는 것은 그만큼 하나하나가 무겁다는 의미!! 결국 잘 선택해서 써야함

  • Example

    class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

다음에 라우팅 하는 방법은 위와 조금 다릅니다.

  • Router 를 통해서 하나의 url 로 처리가 가능합니다.

    from django.urls import path, include
    from . import views
    from rest_framework.routers import DefaultRouter
    
    router = DefaultRouter()
    router.register('viewset',views.PostViewSet)
    
    urlpatterns = [
        path('',include(router.urls)),
    ]

참고

0개의 댓글