DRF의 보기(django rest framework)

1. 두 기류
1)APIView rest_framework.views.APIView APIView는 REST 프레임워크가 제공하는 모든 보기의 기본 클래스로 Django의 View 부류를 계승한다.APIViewView의 차이점은 다음과 같습니다.
  • 보기 방법에 전송된 것은 REST 프레임워크의 Request 대상이지 Django의 HttpRequeset 대상이 아니다.
  • 보기 방법은 REST 프레임워크의 Response 대상을 되돌려주고 보기는 응답 데이터 설정(render)이 전방 요구에 부합되는 형식을 설정합니다.
  • 그 어떠한 APIException이상도 포착되고 적합한 응답 정보로 처리된다.
  • dispatch()분배를 진행하기 전에 요청에 대해 신분인증, 권한검사, 데이터 제어를 실시한다.

  • 정의된 속성을 지원합니다.
  • authentication_classes 목록 또는 원조, 신분인증 클래스
  • permissoin_classes 목록 또는 원조, 권한 검사 클래스
  • throttle_classes 목록 또는 원조, 유량 제어 클래스
  • APIView에서 get(),post() 또는 다른 요청 방식을 일반적인 클래스 보기 정의 방법으로 구현합니다.
    예:
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    # url(r'^books/$', views.BookListView.as_view()),
    class BookListView(APIView):
        def get(self, request):
            books = BookInfo.objects.all()
            serializer = BookInfoSerializer(books, many=True)
            return Response(serializer.data)
    

    2)GenericAPIView rest_framework.generics.GenericAPIView APIVIew에서 계승하여 목록 보기와 상세한 보기에 사용할 수 있는 일반적인 지원 방법을 추가했습니다.일반적으로 사용하는 경우 하나 이상의 Mixin 확장 클래스와 함께 사용할 수 있습니다.
    정의된 속성을 지원합니다.
  • 목록 뷰는 상세 정보 뷰와 동일합니다.
  • queryset 목록 보기의 조회 집합
  • serializer_class 보기에 사용되는 서열화기
  • 목록 보기 사용:
  • pagination_class 페이지 제어 클래스
  • filter_backends 필터 제어 백엔드
  • 세부 정보 페이지 보기:
  • lookup_field 단일 데이터베이스 대상을 조회할 때 사용하는 조건 필드입니다. 기본값은 'pk'
  • lookup_url_kwarg에서 단일 데이터를 조회할 때 URL의 매개 변수 키워드 이름, 기본값과lookfield 동일

  • 제공되는 방법:
  • 목록 뷰는 상세 정보 뷰와 동일합니다.
  • get_set(self) 보기를 되돌려주는 데 사용되는 조회 집합은 목록 보기와 상세한 보기에서 데이터를 얻는 기초입니다. 기본 되돌려주기 queryset 속성은 다시 쓸 수 있습니다. 예를 들어
    def get_queryset(self):
        user = self.request.user
        return user.accounts.all()
    
  • get_serializer_class(self)는 서열화기 클래스를 되돌려줍니다. 기본 되돌려주기 serializer_class 는 다시 쓸 수 있습니다. 예를 들어
    def get_serializer_class(self):
        if self.request.user.is_staff:
            return FullAccountSerializer
        return BasicAccountSerializer
    
  • get_serializer(self,args,*kwargs)는 서열화기 대상을 되돌려주고 다른 보기나 확장 클래스에 사용됩니다. 만약 우리가 보기에서 서열화기 대상을 얻으려면 이 방법을 직접 호출할 수 있습니다.서열화기 대상을 제공할 때 REST 프레임워크는 대상의 context 속성에 세 가지 데이터를 추가합니다: Request,format,view. 이 세 가지 데이터 대상은 서열화기를 정의할 때 사용할 수 있습니다.

  • 자세히 보기:
  • get_object(self)는 자세한 보기에 필요한 모델 클래스 데이터 대상을 되돌려줍니다. 기본값lookup_field 인자로queryset을 필터합니다.시도에서 이 방법으로 자세한 정보를 얻을 수 있는 모델 클래스의 대상을 호출할 수 있습니다.자세한 정보를 방문한 모델 클래스의 대상이 존재하지 않으면 404로 돌아갑니다.이 메서드는 기본적으로 APIView에서 제공하는 check 를 사용합니다.object_permissions 방법은 현재 대상이 접근할 수 있는 권한이 있는지 확인합니다.


  • 예:
    # url(r'^books/(?P\d+)/$', views.BookDetailView.as_view()),
    class BookDetailView(GenericAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer
    
        def get(self, request, pk):
            book = self.get_object()
            serializer = self.get_serializer(book)
            return Response(serializer.data)
    

    2.5개 확장 클래스
    1)ListModelMixin
    목록 보기 확장 클래스, 제공 list(request, *args, **kwargs) 방법으로 목록 보기를 신속하게 실현하고 200 상태 코드를 되돌려줍니다.
    Mixin의list 메서드는 데이터를 필터링하고 페이지를 나눕니다.
    소스 코드:
    class ListModelMixin(object):
        """
        List a queryset.
        """
        def list(self, request, *args, **kwargs):
            #   
            queryset = self.filter_queryset(self.get_queryset())
            #   
            page = self.paginate_queryset(queryset)
            if page is not None:
                serializer = self.get_serializer(page, many=True)
                return self.get_paginated_response(serializer.data)
            #    
            serializer = self.get_serializer(queryset, many=True)
            return Response(serializer.data)
    

    예:
    from rest_framework.mixins import ListModelMixin
    
    class BookListView(ListModelMixin, GenericAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer
    
        def get(self, request):
            return self.list(request)
    

    2)CreateModelMixin
    보기 확장 클래스를 만들고 create(request, *args, **kwargs) 방법을 제공하여 자원을 만드는 보기를 신속하게 실현하고 201 상태 코드를 성공적으로 되돌려줍니다.
    만약 서열화기가 전방에서 보낸 데이터 검증에 실패하면 400 오류를 되돌려줍니다.
    소스 코드:
    class CreateModelMixin(object):
        """
        Create a model instance.
        """
        def create(self, request, *args, **kwargs):
            #       
            serializer = self.get_serializer(data=request.data)
            #   
            serializer.is_valid(raise_exception=True)
            #   
            self.perform_create(serializer)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
    
        def perform_create(self, serializer):
            serializer.save()
    
        def get_success_headers(self, data):
            try:
                return {'Location': str(data[api_settings.URL_FIELD_NAME])}
            except (TypeError, KeyError):
                return {}
    

    3) RetrieveModelMixin
    상세한 보기 확장 클래스는 retrieve(request, *args, **kwargs) 방법을 제공하여 존재하는 데이터 대상을 신속하게 되돌릴 수 있습니다.
    존재하면 200으로 돌아가고 그렇지 않으면 404로 돌아갑니다.
    소스 코드:
    class RetrieveModelMixin(object):
        """
        Retrieve a model instance.
        """
        def retrieve(self, request, *args, **kwargs):
            #     ,        
            instance = self.get_object()
            #    
            serializer = self.get_serializer(instance)
            return Response(serializer.data)
    

    예:
    class BookDetailView(RetrieveModelMixin, GenericAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer
    
        def get(self, request, pk):
            return self.retrieve(request)
    

    4)UpdateModelMixin
    보기 확장 클래스를 업데이트하고 update(request, *args, **kwargs) 방법을 제공하여 존재하는 데이터 대상을 신속하게 업데이트할 수 있습니다.
    또한 partial_update(request, *args, **kwargs) 방법을 제공하여 국부 업데이트를 실현할 수 있다.
    200 을 성공적으로 되돌렸고, 서열화기 검사 데이터가 실패했을 때 400 오류를 되돌려줍니다.
    소스 코드:
    class UpdateModelMixin(object):
        """
        Update a model instance.
        """
        def update(self, request, *args, **kwargs):
            partial = kwargs.pop('partial', False)
            instance = self.get_object()
            serializer = self.get_serializer(instance, data=request.data, partial=partial)
            serializer.is_valid(raise_exception=True)
            self.perform_update(serializer)
    
            if getattr(instance, '_prefetched_objects_cache', None):
                # If 'prefetch_related' has been applied to a queryset, we need to
                # forcibly invalidate the prefetch cache on the instance.
                instance._prefetched_objects_cache = {}
    
            return Response(serializer.data)
    
        def perform_update(self, serializer):
            serializer.save()
    
        def partial_update(self, request, *args, **kwargs):
            kwargs['partial'] = True
            return self.update(request, *args, **kwargs)
    

    5)DestroyModelMixin
    보기 확장 클래스를 삭제하고 destroy(request, *args, **kwargs) 방법을 제공하면 존재하는 데이터 대상을 신속하게 삭제할 수 있습니다.
    204를 성공적으로 반환했습니다. 404를 반환한 것은 존재하지 않습니다.
    소스 코드:
    class DestroyModelMixin(object):
        """
        Destroy a model instance.
        """
        def destroy(self, request, *args, **kwargs):
            instance = self.get_object()
            self.perform_destroy(instance)
            return Response(status=status.HTTP_204_NO_CONTENT)
    
        def perform_destroy(self, instance):
            instance.delete()
    

    3. 사용 가능한 하위 클래스 보기
    1) CreateAPIView
    post 방법 제공
    GenericAPIView, CreateModelMixin에서 상속
    2)ListAPIView
    get 방법 제공
    상속: GenericAPIView, ListModelMixin
    3)RetireveAPIView
    get 방법 제공
    상속: GenericAPIView, RetrieveModelMixin
    4)DestoryAPIView
    삭제 방법 제공
    GenericAPIView, DestoryModelMixin에서 상속
    5)UpdateAPIView
    put 및 patch 방법 제공
    상속: GenericAPIView, UpdateModelMixin
    6)RetrieveUpdateAPIView
    get,put,patch 방법 제공
    GenericAPIView, RetrieveModelMixin, UpdateModelMixin
    7)RetrieveUpdateDestoryAPIView
    get,put,patch,delete 방법 제공
    GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestoryModelMixin

    좋은 웹페이지 즐겨찾기