DRF 프레임의 페이지 나누기 기능 인터페이스

5048 단어
카탈로그
  • DRF 프레임의 페이지 나누기 기능 인터페이스
  • DRF 프레임의 페이지 나누기 기능 인터페이스
    1. 프레임워크에서 세 가지 종류를 제공하여 페이지 나누기 기능을 실현한다.PageNumberPagination,LimitOffsetPagination,CursorPagination
  • PageNumberPagination은 페이지 번호로 페이지가 나뉘는데 이 클래스는 전역 설정을 할 수 있다
  • LimitOffsetPagination 오프셋에 따른 페이지 분할
  • 두 가지 모두 실현할 수 있고 프로그램의 구체적인 디자인에 있어 일부 차이가 있지만 차이가 크지 않다.
  • CursorPagination 암호화 페이지 나누기 기능
  • 2. PageNumberPagination 클래스를 사용하여 페이지 나누기 기능 설계
    Note 페이지 구성 요소의 기본 논리: 페이지 기능을 실현하려면 먼저 데이터베이스에서 모든 데이터를 얻어야 한다. 정상적인 상황에서 데이터를 얻은 후에 직접 실례화된 서열화 클래스를 가져와 데이터를 전방으로 되돌려준다.페이지 구성 요소를 사용하려면 데이터베이스에서 데이터를 얻은 후 실례화 서열화 클래스 이전에 데이터를 페이지 처리하고 처리된 데이터를 instance의 값으로 전달해야 한다.
  • 방식1: PageNumberPagination 클래스를 직접 사용하여 실현
      from rest_framework.pagination import PageNumberPagination
      class Page1View(APIView):
          user_obj = UserInfo.objects.all()
          #        
          pg = PageNumberPagination()
          #       
          page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
          #   paginate_queryset           ,     :
          #1. queryset               
          2.request=request
          3.view        ,    self
          serializer = Page1Serializer(instance=page, many=True)
          return Response(serializer.data)
          #        ,         
  • 방식2: 사용자 정의 페이지 클래스
      #      ,      
      from rest_framework.pagination import PageNumberPagination
      #      
      class MyPagination(PageNumberPagination):
          page_size = 1
          #          
          max_page_size = 4
          #              
          page_query_param = 'page'
          #          
          page_size_query_param = 'size'
          #             
    
      class Page2View(APIView):
          def get(self, request, *args, **kwargs):
              user_obj = UserInfo.objects.all()
              pg = MyPagination()
              page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
              serializer = Page1Serializer(instance=page, many=True)
              data = pg.get_paginated_response(serializer.data)
              #               get_paginated_response                
              return data
  • Note 사용자 정의 페이지 클래스는 PageNumberPagination 클래스를 상속하고 상속 클래스에 설정을 추가하며 사용자 정의 클래스를 통해 원시 데이터를 처리합니다.page_size、max_page_size、page_size_query_param 이 세 개는 한데 묶여 있는데, 주로 모든 중표시된 데이터의 수량을 해결하고, 페이지query_param은 페이지 번호의 매개 변수 이름을 가져오는 것을 주로 해결합니다. getpaginated_response는 상하 링크를 추가하는 기능을 실현하는데 데이터만 원한다면 상하 링크의 기능을 없앨 수 있고 데이터의 소모도 줄일 수 있다.
    3. LimitOffsetPagination을 사용하여 페이지 나누기 기능 구현
    이 클래스는 페이지 나누기 기능이 기본적으로 이전 클래스와 일치합니다. get 검색할 때의 매개 변수 이름이 다르고, 이 클래스는 현재 위치의offset (기본값은 0, 설정 가능) 과 편이량limit (즉 페이지당 표시되는 수량) 에 따라 조회됩니다.
  • 방식1: LimitOffsetPagination을 직접 사용하여 실현
      from rest_framework.pagination import LimitOffsetPagination
    
      class Page3View(APIView):
          def get(self, request, *args, **kwargs):
              user_obj = UserInfo.objects.all()
              pg = LimitOffsetPagination()
              page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
              serializer = Page1Serializer(instance=page, many=True)
              return Response(serializer.data)
  • Note 질의에 대한 URL:http://127.0.0.1:8000/api/users/V1/page3view/?limit=1&offset=2
  • 사용자 정의 페이지 클래스 구현 페이지 기능
      #              
      class MyPagination1(LimitOffsetPagination):
          default_limit = 1
          #             (   )
          max_limit = 3
          #           
          offset_query_param = 'offset'
          #            ,   0
          limit_query_param = 'limit'
          #           
    
      class Page4View(APIView):
          def get(self, request, *args, **kwargs):
              user_obj = UserInfo.objects.all()
              pg = MyPagination1()
              page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
              serializer = Page1Serializer(instance=page, many=True)
              data = pg.get_paginated_response(serializer.data)
              return data
  • 4. CursorPagination 클래스의 사용자 정의 페이지 클래스를 계승하여 페이지 기능을 실현한다.
    Note CursorPagination도 암호화 페이지가 될 수 있고 페이지 번호를 암호화 처리하여 방문자는 페이지 번호를 수정하여 접근할 수 없다. 이 방식은 PageNumberPagination에 비해 페이지를 나누는 방식이 장점은 사용자가 임의로 페이지 번호를 수정하여 데이터베이스 조회 수량이 너무 많아 데이터베이스 과부하와 조회 속도가 느린 문제를 피하는 것이다. 이것도 데이터베이스 조회 성능이 최적화된 것이다.예를 들어 PageNumberPagination에서 사용자는 직접 페이지 번호를 1000으로 바꿀 수 있지만,CursorPagination에서는 위아래 페이지만 볼 수 있다
        from rest_framework.pagination import CursorPagination
    
        class MyPagination2(CursorPagination):
            page_size = 1
            max_page_size = None
            ordering = 'id'
            #   id        
            page_size_query_param = None
            cursor_query_param = 'cursor'
            
        class Page5View(APIView):
            def get(self, request, *args, **kwargs):
                user_obj = UserInfo.objects.all()
                pg = MyPagination2()
                page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
                serializer = Page1Serializer(instance=page, many=True)
                data = pg.get_paginated_response(serializer.data)
                return data

    좋은 웹페이지 즐겨찾기