Django REST Framework 페이지(Pagination)상세 설명

앞의 DRF 시리즈 튜 토리 얼 에서 저 희 는 블 로 그 를 예 로 들 어 직렬 화 기 를 소 개 했 습 니 다.클래스 기반 보기 APIView 와 ModelViewSet 을 사용 하여 글 자원 에 대한 추가 삭제 와 수정 을 위 한 완전한 API 점 을 개 발 했 고 권한 과 인증(jwt 인증 포함)을 상세 하 게 정리 하고 보 여 주 었 습 니 다.이 글 에서 Django REST Framework 에서 페이지 를 나 누 는 방법 을 보 여 드 리 겠 습 니 다.
페이지 를 나누다
페이지 를 왜 나 눠 요?데이터베이스 데이터 의 양 이 매우 많 을 때,만약 한 번 에 이 데 이 터 를 조회 한다 면,반드시 서버 메모리 의 부 하 를 증가 시 켜 시스템 의 운행 속 도 를 낮 출 것 이다.더 좋 은 방법 은 데이터 세그먼트 를 사용자 에 게 보 여 주 는 것 이다.사용자 가 보 여 준 세그먼트 데이터 에서 자신의 내용 을 찾 지 못 하면 원 하 는 내용 을 찾 을 때 까지 페이지 번호 나 페이지 를 넘 기 는 방식 으로 더 많은 데 이 터 를 볼 수 있 습 니 다.
Django REST Framework 는 3 가지 페이지 클래스 를 제공 합 니 다.다음 에 저 희 는 각각 프 리 젠 테 이 션 을 진행 할 것 입 니 다.
  • PageNumberPagination 클래스:간단 한 페이지 분할 기.사용자 버튼 지원?page=3 이런 방식 으로 조회 하면 pagesize 이 매개 변 수 는 각 페이지 가 사용자 에 게 보 여 주 는 데이터 의 수 를 수 동 으로 지정 합 니 다.사용자 가 누 르 는 것 도 지원 합 니까?page=3&size=10 이라는 더욱 유연 한 방식 으로 조 회 를 하면 사용 자 는 페이지 번 호 를 선택 할 수 있 을 뿐만 아니 라 각 페이지 에 표 시 된 데이터 의 수량 도 선택 할 수 있다.두 번 째 상황 에 대해 서 는 max 를 설정 해 야 합 니 다.page_size 라 는 매개 변 수 는 페이지 마다 데 이 터 를 보 여 주 는 최대 수량 을 제한 하여 사용자 가 악의 적 으로 조회 하 는 것 을 방지 합 니 다(예 를 들 어 size=10000).이런 페이지 에 1 만 개의 데 이 터 를 보 여 주 는 것 은 페이지 를 무의미 하 게 만 들 것 입 니 다.
  • Limit Offset Pagination 클래스:오프셋 페이지 기.사용자 버튼 지원?limit=20&offset=100 이런 방식 으로 조회 합 니 다.offset 은 데 이 터 를 조회 하 는 시작 점 입 니 다.limit 는 각 페이지 에 데 이 터 를 보 여 주 는 최대 갯 수 입 니 다.page 와 유사 합 니 다.size。이 종 류 를 사용 할 때 max 를 설정 해 야 합 니 다.limit 이 매개 변 수 는 사용자 에 게 보 여 주 는 데이터 의 최대 수량 을 제한 합 니 다.
  • Cursor Pagination 클래스:암호 화 페이지 기.이것 은 DRF 가 제공 하 는 암호 화 된 페이지 조회 로 사용자 가 응답 이 제공 한 이전 페이지 와 다음 페이지 링크 에 따라 페이지 조 회 를 할 수 있 도록 지원 하 며 각 페이지 의 페이지 번 호 는 암호 화 되 어 있다.이러한 방식 으로 페이지 를 나 누 려 면 모델 에'created'라 는 필드 가 있어 야 합 니 다.그렇지 않 으 면 ordering 정렬 을 수 동 으로 지정 해 야 사용 할 수 있 습 니 다.
  • PageNumberPagination 클래스 사용 하기
    DRF 에서 기본 페이지 클래스 를 사용 하 는 가장 쉬 운 방법 은 settings.py 에서 전역 설정 을 하 는 것 입 니 다.다음 과 같 습 니 다.
    
    REST_FRAMEWORK ={
     'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE':2
    }
    전시 효 과 는 다음 과 같 습 니 다.각 페이지 에 두 개의 기록 을 보 여 줍 니 다.사용자 가 각 페이지 에 데 이 터 를 보 여 주 는 수량 을 지정 하 는 것 은 지원 되 지 않 습 니 다.

    하지만 사용자 가 누 르 기 를 원한 다 면?page=3&size=10 이라는 더욱 유연 한 방식 으로 조 회 를 하려 면 맞 춤 형 맞 춤 형 제작 을 해 야 한다.실제 개발 과정 에서 맞 춤 형 제작 은 기본 페이지 류 를 사용 하 는 것 보다 더 흔 하 며 구체 적 인 방법 은 다음 과 같다.
    첫 번 째 단계:app 디 렉 터 리 에 pagination.py 를 새로 만 들 고 다음 코드 를 추가 합 니 다.
    #blog/pagination.py
    
    from rest_framework.pagination import PageNumberPagination
     
     
    class MyPageNumberPagination(PageNumberPagination):
     page_size = 2 # default page size
     page_size_query_param = 'size' # ?page=xx&size=??
     max_page_size = 10 # max page size
    Google 은 PageNumberPagination 클래스 를 사용자 정의 합 니 다.이 클래스 는 PageNumberPagination 클래스 를 계승 합 니 다.우 리 는 페이지 를 통 해size 는 각 페이지 의 기본 데 이 터 를 보 여 주 는 줄 수 를 설정 하고 page 를 통 해size_query_param 은 각 페이지 size 의 매개 변수 이름 을 설정 하고 max 를 통 해page_size 는 보 여줄 수 있 는 최대 데이터 줄 수 를 설정 합 니 다.
    두 번 째 단계:사용자 정의 페이지 클래스 사용
    클래스 기반 보기에 서 pagination 을 사용 할 수 있 습 니 다.class 이 속성 은 사용자 정의 페이지 클래스 를 사용 합 니 다.다음 과 같 습 니 다.
    
    from rest_framework import viewsets
    from .pagination import MyPageNumberPagination
     
     
     
     
    class ArticleViewSet(viewsets.ModelViewSet):
     #         ArticleList ArticleDetail    
     queryset = Article.objects.all()
     serializer_class = ArticleSerializer
     pagination_class = MyPageNumberPagination
     
     
     
     
     #     , request.user author  
     def perform_create(self, serializer):
      serializer.save(author=self.request.user)
     
     
     #     , request.user author  
     def perform_update(self, serializer):
      serializer.save(author=self.request.user)
    전시 효 과 는 다음 과 같다.

    물론 맞 춤 형 페이지 클래스 는 지정 페이지 에 국한 되 지 않 습 니 다.size 와 maxpage_size 이 속성 들 은 데이터 에 응답 하 는 출력 형식 도 바 꿀 수 있 습 니 다.예 를 들 어 next 와 previous 를 links 라 는 key 에 넣 고 싶 습 니 다.MyPageNumberPagination 류 를 수정 하고 get 을 다시 쓸 수 있 습 니 다.paginated_response 방법:
    
    from rest_framework.pagination import PageNumberPagination
    from rest_framework.response import Response
     
     
     
     
    class MyPageNumberPagination(PageNumberPagination):
     page_size = 2 # default page size
     page_size_query_param = 'size' # ?page=xx&size=??
     max_page_size = 10 # max page size
     def get_paginated_response(self, data):
      return Response({
       'links': {
        'next': self.get_next_link(),
        'previous': self.get_previous_link()
       },
       'count': self.page.paginator.count,
       'results': data
      })
    새로운 전시 효 과 는 다음 과 같다.

    메모:다시 쓰기 getpaginated_response 방법 은 매우 유용 합 니 다.페이지 응답 데이터 에 추가 적 인 내용 을 전달 할 수 있 습 니 다.예 를 들 어 code 상태 코드 등 입 니 다.
    앞의 예 에서 우 리 는 클래스 기반 보기 나 보기 에서 만 페이지 클래스 에 집중 적 으로 사 용 했 습 니 다.settings.py 전역 에서 사용자 정의 페이지 클래스 를 사용 할 수 있 습 니 다.다음 과 같 습 니 다.전시 효과 가 같 으 니 우 리 는 상세 하 게 설명 하지 않 겠 다.
    
    REST_FRAMEWORK = {
     'DEFAULT_PAGINATION_CLASS': 'blog.pagination.MyPageNumberPagination',
    }
    LimitOffset Pagination 클래스 사용 하기
    이 페이지 클래스 를 사용 하 는 가장 간단 한 방법 은 settings.py 에서 전역 설정 을 하 는 것 입 니 다.다음 과 같 습 니 다.
    
    REST_FRAMEWORK = {
     'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'
    }
    전시 효 과 는 다음 과 같 습 니 다.6 조 데 이 터 를 찾 아 보면 페이지 당 2 조 를 보 여 줍 니 다.

    MyLimit Offset Pagination 클래스 를 사용자 정의 할 수 있 습 니 다.단일 보기 나 보기에 서 집중 적 으로 사용 하거나 전역 적 으로 사용 할 수 있 습 니 다.
    
    from rest_framework.pagination import LimitOffsetPagination
     
     
    class MyLimitOffsetPagination(LimitOffsetPagination):
     default_limit = 5 # default limit per age
     limit_query_param = 'limit' # default is limit
     offset_query_param = 'offset' # default param is offset
     max_limit = 10 # max limit per age
    CursorPagination 클래스 사용 하기
    전역 사용
    
    REST_FRAMEWORK = {
     'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.CursorPagination',
     'PAGE_SIZE': 2
    }
    전시 효 과 는 다음 과 같다.

    뭐?왜 잘못 됐어 요?Cursor Pagination 클래스 를 사용 하려 면 모델 에 created 필드 가 있어 야 합 니 다.그렇지 않 으 면 ordering 필드 를 수 동 으로 지정 해 야 합 니 다.Cursor Pagination 클래스 는 정렬 된 조회 집합 만 페이지 별로 표시 할 수 있 기 때 문 입 니 다.우리 Article 모델 은 create 밖 에 없어 요.date 필드,created 이 필드 가 없어 서 오류 가 발생 할 수 있 습 니 다.
    이 문 제 를 해결 하기 위해 서 는 MyCursor Pagination 류 를 사용자 정의 하고 create 를 수 동 으로 지정 해 야 합 니 다.date 정렬 은 다음 과 같 습 니 다.
    #blog/pagination.py
    
    from rest_framework.pagination import CursorPagination
     
     
    class MyArticleCursorPagination(CursorPagination):
     page_size = 3 # Default number of records per age
     page_size_query_param = 'page_size' 
     cursor_query_param = 'cursor' # Default is cursor
     ordering = '-create_date'
    settings.py 를 수정 하고 자신 이 정의 한 페이지 클래스 를 사용 합 니 다.
    
    REST_FRAMEWORK = {
     'DEFAULT_PAGINATION_CLASS': 'blog.pagination.MyArticleCursorPagination',
    }
    응답 효 과 는 다음 과 같 습 니 다.previous 와 next 페이지 링크 를 얻 을 수 있 습 니 다.페이지 번호 가 암호 화 되 어 링크 에 페이지 번호 가 표시 되 지 않 습 니 다.기본 페이지 당 3 개의 기록 을 보 여 줍 니 다.사용 하면?page_size=2 조 회 를 진행 하면 페이지 당 두 개의 기록 을 얻 을 수 있 습 니 다.

    물론 이 ordering 필드 는 모델 과 관련 되 어 있 기 때문에 사용자 정의 CursorPagination 류 를 전역 적 으로 사용 하 는 것 을 추천 하지 않 습 니 다.더 좋 은 방법 은 GenericsAPIView 나 그림 집 view sets 에서 pagination 을 통 해class 속성 지정,다음 과 같 습 니 다:
    
    from rest_framework import viewsets
    from .pagination import MyArticleCursorPagination
     
     
     
     
    class ArticleViewSet(viewsets.ModelViewSet):
     #         ArticleList ArticleDetail    
     queryset = Article.objects.all()
     serializer_class = ArticleSerializer
     pagination_class = MyArticleCursorPagination
     #     , request.user author  
     def perform_create(self, serializer):
      serializer.save(author=self.request.user)
     
     
     #     , request.user author  
     def perform_update(self, serializer):
      serializer.save(author=self.request.user)
    함수 클래스 보기 에서 페이지 클래스 사용 하기
    pagination 주의class 속성 은 genericsAPIView 와 그림 집합 viewset 에서 만 설정 할 수 있 습 니 다.함수 나 간단 한 APIView 를 사용 하여 API 보 기 를 개발 하려 면 데 이 터 를 수 동 으로 페이지 를 나 누 어야 합 니 다.구체 적 인 사용 예 는 다음 과 같 습 니 다.
    
    from rest_framework.pagination import PageNumberPagination
    class ArticleList0(APIView):
     """
     List all articles, or create a new article.
     """
     def get(self, request, format=None):
      articles = Article.objects.all()
     
     
      page = PageNumberPagination() #          
      page.page_size = 3 #             
      page.page_query_param = 'page' #          page
      page.page_size_query_param = 'size' #              
      page.max_page_size = 10 #              ,             
      ret = page.paginate_queryset(articles, request)
      serializer = ArticleSerializer(ret, many=True)
     
     
      return Response(serializer.data)
    작은 매듭
    본 고 는 DRF 가 제공 하 는 세 가지 페이지 유형 을 정리 하고 이 를 어떻게 사용 하 는 지 상세 하 게 보 여 주 었 습 니 다.배 웠 습 니까?
    Django REST Framework 페이지(Pagination)에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 Django REST Framework 페이지 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기