Django REST Framework/DRF 일반

[DRF] 공식 문서 - pagination 정리

bluebamus 2024. 1. 19.

 1. Pagination

   1) 정의

      - REST 프레임워크는 사용자 정의 가능한 페이지네이션 스타일을 지원한다. 이를 통해 큰 결과 세트가 개별 데이터 페이지로 분할될 수 있도록 수정할 수 있다.

      - 페이지네이션 API는 다음 두 가지를 지원할 수 있다.

         - 응답의 내용 부분에 제공되는 페이징네이션 링크.

         - Content-Range 또는 Link와 같은 응답 헤더에 포함된 페이지네이션 링크.

 

      - 현재 내장된 스타일은 모두 응답의 내용 부분에 포함된 링크를 사용한다. 이 스타일은 탐색 가능한 API를 사용할 때 더욱 접근하기 쉽다.

      - 페이지네이션은 일반 뷰나 뷰셋을 사용하는 경우에만 자동으로 수행된다. 일반 APIView를 사용하는 경우, 페이지네이션 API를 직접 호출하여 페이징된 응답을 반환해야 한다. 예시를 보려면 mixins.ListModelMixin과 generics.GenericAPIView 클래스의 소스 코드를 참조하면 된다.

      - 페이지네이션 클래스를 None으로 설정하면 페이지네이션을 끌 수 있다.

 

   2) Setting the pagination style

      - 페이지네이션 스타일은 DEFAULT_PAGINATION_CLASS와 PAGE_SIZE 설정 키를 사용하여 전역적으로 설정할 수 있다. 예를 들어, 내장된 limit/offset 페이지네이션을 사용하려면 다음과 같이 하면 된다.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 100
}

 

      - 페이지네이션 클래스와 사용해야 할 페이지 크기를 함께 설정해야 한다는 점에 유의해야 한다.

         - DEFAULT_PAGINATION_CLASS와 PAGE_SIZE는 기본적으로 None으로 설정되어 있다.

      - pagination_class 속성을 사용하여 개별 뷰에 페이지네이션 클래스를 설정할 수도 있다. 일반적으로 API 전체에서 동일한 페이지네이션 스타일을 사용하고자 할 것이지만, 기본 또는 최대 페이지 크기와 같은 페이지네이션의 개별적인 면을 뷰별로 다르게 설정하려 할 수도 있다.

 

   3) Modifying the pagination style

      - 페이징네이션 스타일의 특정 부분을 수정하고 싶다면, 페이징네이션 클래스 중 하나를 재정의하고 변경하고자 하는 속성을 설정해야 한다.

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 1000
    page_size_query_param = 'page_size'
    max_page_size = 10000

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 100
    page_size_query_param = 'page_size'
    max_page_size = 1000

 

      - 그런 다음 pagination_class 속성을 사용하여 새로운 스타일을 뷰에 적용할 수 있다.

class BillingRecordsView(generics.ListAPIView):
    queryset = Billing.objects.all()
    serializer_class = BillingRecordsSerializer
    pagination_class = LargeResultsSetPagination

 

      - 또는 DEFAULT_PAGINATION_CLASS 설정 키를 사용하여 스타일을 전역적으로 적용할 수 있습니다. 예를 들면 다음과 같다.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'apps.core.pagination.StandardResultsSetPagination'
}

 

 2. API Reference

   1) PageNumberPagination

      - 이 페이지네이션 스타일은 요청 쿼리 파라미터에서 단일 숫자 페이지 번호를 받아들인다.

      - Request:

GET https://api.example.org/accounts/?page=4

 

      - Response:

HTTP 200 OK
{
    "count": 1023,
    "next": "https://api.example.org/accounts/?page=5",
    "previous": "https://api.example.org/accounts/?page=3",
    "results": [
       …
    ]
}

 

      1. Setup

         - PageNumberPagination 스타일을 전역적으로 활성화하려면 다음 설정을 사용하고, 원하는대로 PAGE_SIZE를 설정하면 된다.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100
}

 

         - GenericAPIView 하위 클래스에서는 pagination_class 속성을 설정하여 뷰별로 PageNumberPagination을 선택할 수도 있다.

 

      2. Configuration

         - PageNumberPagination 클래스에는 페이지네이션 스타일을 수정하기 위해 오버라이드할 수 있는 여러 속성이 포함되어 있다.

         - 이러한 속성을 설정하려면 PageNumberPagination 클래스를 오버라이드하고, 위에서처럼 사용자 정의 페이징네이션 클래스를 활성화해야 한다.

            - django_paginator_class - 사용할 Django Paginator 클래스이다. 기본값은 django.core.paginator.Paginator로, 대부분의 사용 사례에 적합하다.
            - page_size - 페이지 크기를 나타내는 숫자 값이다. 설정된 경우, 이는 PAGE_SIZE 설정을 오버라이드한다. 기본값은 PAGE_SIZE 설정 키와 동일한 값이다.
            - page_query_param - 페이징네이션 제어를 위해 사용할 쿼리 파라미터의 이름을 나타내는 문자열 값이다.

            - page_size_query_param - 설정된 경우, 이는 클라이언트가 요청별로 페이지 크기를 설정할 수 있게 하는 쿼리 파라미터의 이름을 나타내는 문자열 값이다. 기본값은 None으로, 클라이언트가 요청한 페이지 크기를 제어할 수 없음을 나타낸다.
            - max_page_size - 설정된 경우, 이는 요청된 페이지 크기의 최대 허용 값을 나타내는 숫자 값이다. 이 속성은 page_size_query_param도 설정된 경우에만 유효하다.
            - last_page_strings - 세트의 마지막 페이지를 요청하기 위해 page_query_param과 함께 사용할 수 있는 값들을 나타내는 문자열 값의 리스트 또는 튜플이다. 기본값은 ('last',)이다.
            - template - 탐색 가능한 API에서 페이징네이션 컨트롤을 렌더링할 때 사용할 템플릿의 이름이다. 렌더링 스타일을 수정하기 위해 오버라이드하거나, HTML 페이징네이션 컨트롤을 완전히 비활성화하기 위해 None으로 설정할 수 있다. 기본값은 "rest_framework/pagination/numbers.html" 이다.

 

   2) LimitOffsetPagination

      - 이 페이지네이션 스타일은 여러 데이터베이스 레코드를 조회할 때 사용되는 문법을 반영한다. 클라이언트는 "limit"과 "offset" 쿼리 파라미터를 모두 포함한다. limit은 반환할 항목의 최대 수를 나타내며, 다른 스타일에서의 page_size에 해당한다. offset은 전체 비페이징 아이템 집합에 대한 쿼리의 시작 위치를 나타낸다.

 

      - Request:

GET https://api.example.org/accounts/?limit=100&offset=400

 

      - Response:

HTTP 200 OK
{
    "count": 1023,
    "next": "https://api.example.org/accounts/?limit=100&offset=500",
    "previous": "https://api.example.org/accounts/?limit=100&offset=300",
    "results": [
       …
    ]
}

 

      1. Setup

         - LimitOffsetPagination 스타일을 전역적으로 활성화하려면 다음 설정을 사용하면 된다.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'
}

 

         - 선택적으로 PAGE_SIZE 키도 설정할 수 있다. PAGE_SIZE 파라미터도 사용되면 limit 쿼리 파라미터는 선택사항이 되어 클라이언트에서 생략할 수 있다.
         - GenericAPIView 하위 클래스에서는 pagination_class 속성을 설정하여 각 뷰별로 LimitOffsetPagination을 선택할 수도 있다.

 

      2. Configuration

            - LimitOffsetPagination 클래스에는 페이지네이션 스타일을 수정하기 위해 오버라이드할 수 있는 여러 속성이 포함되어 있다.

            - 이러한 속성을 설정하려면 LimitOffsetPagination 클래스를 오버라이드하고, 위에서처럼 사용자 정의 페이징네이션 클래스를 활성화해야 한다.

               - default_limit : 클라이언트가 쿼리 파라미터로 제공하지 않은 경우 사용할 제한을 나타내는 숫자 값이다. 기본값은 PAGE_SIZE 설정 키와 동일한 값이다.
               - limit_query_param : "limit" 쿼리 파라미터의 이름을 나타내는 문자열 값이다. 기본값은 'limit'이다.
               - offset_query_param : "offset" 쿼리 파라미터의 이름을 나타내는 문자열 값이다. 기본값은 'offset'이다.
               - max_limit : 설정된 경우, 이는 클라이언트가 요청할 수 있는 최대 허용 제한을 나타내는 숫자 값이다. 기본값은 None이다.
               - template : 탐색 가능한 API에서 페이징네이션 컨트롤을 렌더링할 때 사용할 템플릿의 이름이다. 렌더링 스타일을 수정하기 위해 오버라이드하거나, HTML 페이징네이션 컨트롤을 완전히 비활성화하기 위해 None으로 설정할 수 있다. 기본값은 "rest_framework/pagination/numbers.html" 이다.

 

   3) CursorPagination

      - 커서 기반 페이지네이션은 클라이언트가 결과 세트를 페이지로 나눌 수 있도록 하는 불투명한 "커서" 지시자를 제공한다. 이 페이지네이션 스타일은 앞으로 가기와 뒤로 가기 컨트롤만 제공하며, 클라이언트가 임의의 위치로 탐색하는 것을 허용하지 않는다.

      - 커서 기반 페이지네이션은 결과 세트의 항목이 고유하고 변하지 않는 순서를 가지고 있어야 한다. 이 순서는 일반적으로 레코드의 생성 타임스탬프일 수 있으며, 이는 페이징네이션에 대한 일관된 순서를 제공한다.

      - 커서 기반 페이지네이션은 다른 스키마보다 복잡합니다. 또한 결과 세트가 고정된 순서를 제공해야 하며, 클라이언트가 결과 세트에 임의로 색인을 생성할 수 없다. 하지만 다음과 같은 이점을 제공한다.

         - 일관된 페이징네이션 뷰를 제공한다 : 올바르게 사용되면 CursorPagination은 클라이언트가 레코드를 페이지로 나누는 동안 다른 클라이언트가 새 항목을 삽입하더라도 동일한 항목을 두 번 보지 않게 보장한다.

         - 매우 큰 데이터셋과 함께 사용할 수 있다 : 극도로 큰 데이터셋에서는 오프셋 기반의 페이징네이션 스타일을 사용하면 비효율적이거나 사용할 수 없게 될 수 있다. 대신 커서 기반 페이징네이션 스키마는 고정된 시간 속성을 가지고 있으며, 데이터셋 크기가 증가하더라도 속도가 느려지지 않는다.

 

      1. Details and limitations

         - 커서 기반 페이지네이션의 사용은 세심한 주의를 필요로 한다. 적용할 정렬 방식에 대해 고민이 필요하다. 기본값은 "-created"에 의해 정렬하는 것이다. 이는 모델 인스턴스에 'created' 타임스탬프 필드가 있어야 하며, 가장 최근에 추가된 항목부터 "타임라인" 스타일의 페이지네이션 뷰를 제공한다는 것을 가정한다.

         - 페이지네이션 클래스의 'ordering' 속성을 오버라이드하거나 OrderingFilter 필터 클래스와 CursorPagination을 함께 사용하여 정렬을 수정할 수 있다. OrderingFilter와 함께 사용할 때 사용자가 정렬할 수 있는 필드를 제한하는 것을 적극적으로 고려해야 한다.

         - 커서 페이지네이션의 적절한 사용은 다음을 만족하는 정렬 필드를 가져야 한다.

            - 생성시에 한 번만 설정되는 타임스탬프, 슬러그, 또는 다른 변경되지 않는 값을 가져야 한다.

            - 고유하거나 거의 고유해야 한다. 밀리초 정밀도 타임스탬프가 좋은 예이다. 이 커서 페이지네이션 구현은 정확하게 고유하지 않은 값을 정렬로 적절히 지원할 수 있는 스마트한 "위치 플러스 오프셋" 스타일을 사용한다.

            - 문자열로 변환할 수 있는 비 널 값이어야 한다.

            - 실수(float)가 아니어야 한다. 정밀도 오류는 쉽게 잘못된 결과를 초래한다. 힌트: 대신 소수를 사용하면 된다. (이미 실수 필드를 가지고 있고 그것으로 페이징해야 하는 경우, 정밀도를 제한하기 위해 소수를 사용하는 CursorPagination 서브클래스 예제가 여기에 있다.)

            - 필드는 데이터베이스 인덱스를 가져야 한다.

 

         - 이러한 제약 조건을 만족시키지 않는 정렬 필드를 사용하면 대체로 작동하지만, 커서 페이징네이션의 일부 이점을 잃게 된다.

         - 커서 페이지네이션에 대한 구현에 대한 더 많은 기술적 세부 사항을 원한다면, "Disqus API에 대한 커서 빌드" 블로그 글이 기본적인 접근법에 대한 좋은 개요를 제공한다.

            - https://cra.mr/2011/03/08/building-cursors-for-the-disqus-api

 

      2. Setup

         - CursorPagination 스타일을 전역적으로 활성화하려면, 다음의 설정을 사용하고, 필요에 따라 PAGE_SIZE를 수정해야 한다.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.CursorPagination',
    'PAGE_SIZE': 100
}

 

         - GenericAPIView의 하위 클래스에서 pagination_class 속성을 설정하여 뷰별로 CursorPagination을 선택할 수 있다.

 

      3. Configuration

         - CursorPagination 클래스에는 페이지네이션 스타일을 수정하기 위해 오버라이드할 수 있는 여러 속성이 포함되어 있다.

         - 이러한 속성을 설정하려면 CursorPagination 클래스를 오버라이드하고, 위에서처럼 사용자 정의 페이징네이션 클래스를 활성화해야 한다.

            - page_size - 페이지 크기를 나타내는 숫자 값이다. 설정된 경우, 이는 PAGE_SIZE 설정을 오버라이드한다. 기본값은 PAGE_SIZE 설정 키와 동일한 값이다.

            - cursor_query_param - 'cursor' 쿼리 파라미터의 이름을 나타내는 문자열 값이다. 기본값은 'cursor'이다.

            - ordering - 이것은 문자열이거나 문자열의 리스트여야 하며, 커서 기반 페이징네이션이 적용될 필드를 나타낸다. 예를 들어: ordering = 'slug'. 기본값은 -created이다. 이 값은 뷰에서 OrderingFilter를 사용하여 오버라이드할 수도 있다.

            - template - 탐색 가능한 API에서 페이징네이션 컨트롤을 렌더링할 때 사용할 템플릿의 이름이다. 렌더링 스타일을 수정하기 위해 오버라이드하거나, HTML 페이징네이션 컨트롤을 완전히 비활성화하기 위해 None으로 설정할 수 있다. 기본값은 "rest_framework/pagination/previous_and_next.html"이다.

 

 3. Custom pagination styles

   - 사용자 정의 페이지네이션 시리얼라이저 클래스를 생성하려면, pagination.BasePagination의 하위 클래스를 상속받고, paginate_queryset(self, queryset, request, view=None)와 get_paginated_response(self, data) 메소드를 오버라이드해야 한다.

      - paginate_queryset 메소드는 초기 쿼리셋에 전달되며, 요청된 페이지의 데이터만 포함하는 반복 가능한 객체를 반환해야 한다.

      - get_paginated_response 메소드는 시리얼라이즈된 페이지 데이터에 전달되며, Response 인스턴스를 반환해야 한다.

   - paginate_queryset 메소드는 페이지네이션 인스턴스의 상태를 설정할 수 있음을 유의해야 한다. 이 상태는 나중에 get_paginated_response 메소드에서 사용될 수 있다.

 

   - 예시 :  특정 사용자가 특정 페이지에 액세스하려 할 때마다 페이지에 대한 액세스 시간을 저장하고, 이 정보를 나중에 get_paginated_response 메소드에서 사용하는 가상의 시나리오를 기반으로 한다.

from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
from datetime import datetime

class CustomPagination(PageNumberPagination):
    def paginate_queryset(self, queryset, request, view=None):
        # 여기서 super().paginate_queryset를 호출하여 기본 쿼리셋 페이징 동작을 수행합니다.
        self.page = super().paginate_queryset(queryset, request, view)
        
        # 사용자가 페이지에 액세스한 시간을 인스턴스 변수에 저장합니다.
        # 이 정보는 get_paginated_response에서 사용될 수 있습니다.
        self.access_time = datetime.now()

        return self.page

    def get_paginated_response(self, data):
        # 여기서는 super().get_paginated_response를 호출하여 기본 응답 동작을 수행합니다.
        response = super().get_paginated_response(data)
        
        # paginate_queryset에서 저장한 액세스 시간을 응답 헤더에 추가합니다.
        response['X-Access-Time'] = self.access_time

        return response

 

   1) Example

         - 기본 페이지네이션 출력 스타일을 'links'라는 중첩된 키 아래에 다음과 이전 링크를 포함하는 수정된 형식으로 바꾸려고 한다고 가정해보자. 이럴 경우, 우리는 사용자 정의 페이징네이션 클래스를 다음과 같이 지정할 수 있다.

class CustomPagination(pagination.PageNumberPagination):
    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
        })

 

        - 그런 다음, 우리의 설정에서 사용자 정의 클래스를 설정해야 한다.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'my_project.apps.core.pagination.CustomPagination',
    'PAGE_SIZE': 100
}

 

         - 탐색 가능한 API에서 응답의 키 순서에 대해 신경 쓴다면, 페이징된 응답의 본문을 구성할 때 OrderedDict를 사용하는 것이 좋다. 그러나 이는 선택 사항일 뿐이다.

from collections import OrderedDict
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response

class CustomPagination(PageNumberPagination):
    def get_paginated_response(self, data):
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('next', self.get_next_link()),
            ('previous', self.get_previous_link()),
            ('results', data)
        ]))


         - OrderedDict는 일반적인 딕셔너리(dict)와 비슷하지만, 항목이 추가된 순서를 기억하는 특징이 있다. 이는 특정 경우에 딕셔너리의 키 순서가 중요할 때 유용하다.

         - 예를 들어, API 응답의 키 순서를 보장하거나, 데이터베이스 필드의 순서를 유지하려는 경우에 사용될 수 있다.

 

   2) Using your custom pagination class

      - 사용자 정의 페이지네이션 클래스를 기본으로 사용하려면, DEFAULT_PAGINATION_CLASS 설정을 사용하면 된다.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'my_project.apps.core.pagination.LinkHeaderPagination',
    'PAGE_SIZE': 100
}

 

      - 이제 목록 엔드포인트에 대한 API 응답은 응답 본문의 일부로 페이지네이션 링크를 포함하는 대신 Link 헤더를 포함하게 된다.

 

      - 'Link' 헤더를 사용하는 사용자 정의 페이지네이션 스타일

 

 4 .HTML pagination controls

   - 기본적으로 페이지네이션 클래스를 사용하면, 브라우저에서 HTML 페이지네이션 컨트롤이 표시된다. 내장된 두 가지 디스플레이 스타일이 있다. PageNumberPagination과 LimitOffsetPagination 클래스는 이전 및 다음 컨트롤과 함께 페이지 번호 목록을 표시한다. CursorPagination 클래스는 이전 및 다음 컨트롤만 표시하는 더 간단한 스타일을 나타낸다.

 

   1) Customizing the controls

      - HTML 페이지네이션 컨트롤을 렌더링하는 템플릿을 재정의할 수 있다. 두 가지 내장 스타일은 다음과 같다.

         - rest_framework/pagination/numbers.html

         - rest_framework/pagination/previous_and_next.html

 

      - 이러한 경로 중 하나를 전역 템플릿 디렉토리에 제공하면 관련 페이지네이션 클래스에 대한 기본 렌더링이 재정의된다.


      - 또는, 기존 클래스 중 하나를 서브클래스화하여 template = None을 클래스 속성으로 설정함으로써 HTML 페이지네이션 컨트롤을 완전히 비활성화할 수 있습다. 그런 다음 DEFAULT_PAGINATION_CLASS 설정 키를 구성하여 사용자 정의 클래스를 기본 페이지네이션 스타일로 사용하도록 설정해야 한다.

 

      1. Low-level API

         - 페이지네이션 클래스가 컨트롤을 표시해야 할지 여부를 결정하는 저수준 API는 페이지네이션 인스턴스에서 display_page_controls 속성으로 제공된다. HTML 페이지네이션 컨트롤을 표시해야 한다면, 사용자 지정 페이지네이션 클래스는 paginate_queryset 메소드에서 True로 설정되어야 한다.

         - 또한, 컨트롤 렌더링 방식을 추가로 사용자 정의하려면 사용자 정의 페이지네이션 클래스에서 .to_html() 및 .get_html_context() 메소드를 재정의할 수 있다.

 

 5. Third party packages

   1) DRF-extensions

      - DRF-extensions 패키지에는 API 사용자가 ?page_size=max를 통해 최대 허용 페이지 크기를 가져올 수 있도록 하는 PaginateByMaxMixin 믹스인 클래스를 포함하고 있다.

         - DRF-extensions : https://chibisov.github.io/drf-extensions/docs/

         - PaginateByMaxMixin : https://chibisov.github.io/drf-extensions/docs/#paginatebymaxmixin

pip install drf-extensions

 

      - PaginateByMaxMixin을 사용하여 페이지네이션을 설정한 뷰를 만들 수 있다.

from rest_framework import viewsets
from rest_framework_extensions.mixins import PaginateByMaxMixin
from myapp.models import MyModel
from myapp.serializers import MyModelSerializer

class MyModelViewSet(PaginateByMaxMixin, viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    pagination_class = MyModelViewSet

 

      - 이제 API 클라이언트는 ?page_size=max를 URL에 추가하여 요청을 보낼 수 있다. 이렇게 하면 서버는 최대 허용 페이지 크기를 반환한다. 예를 들어, 다음과 같이 요청을 보낼 수 있다.

http://localhost:8000/api/mymodels/?page_size=max

 

      - 이렇게 하면 MyModelViewSet 뷰가 최대 페이지 크기를 반환한다. 이 최대 페이지 크기는 DRF-extensions의 설정에 따라 결정된다

 

   2) drf-proxy-pagination

      - drf-proxy-pagination 패키지는 페이지네이션 클래스를 쿼리 파라미터로 선택할 수 있게 해주는 ProxyPagination 클래스를 포함하고 있습니다.

        - drf-proxy-pagination : https://github.com/tuffnatty/drf-proxy-pagination

 

pip install drf-proxy-pagination

 

      - ProxyPagination을 사용하여 페이지네이션을 설정한 뷰를 만들 수 있다. 

from rest_framework import viewsets
from drf_proxy_pagination import ProxyPagination
from myapp.models import MyModel
from myapp.serializers import MyModelSerializer

class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    pagination_class = ProxyPagination
http://localhost:8000/api/mymodels/?pagination_class=page_number

 

      - 이 요청은 'page_number' 페이지네이션 클래스를 사용하고, 2번째 페이지의 5개 아이템을 요청하는 것이다.

      - 이와 같이 drf-proxy-pagination 패키지는 쿼리 매개변수를 사용하여 페이지네이션 클래스를 선택하고, 페이지 번호와 페이지 크기를 지정하는 기능을 제공한다.

http://localhost:8000/api/mymodels/?pagination_class=page_number&page=2&page_size=5

 

      - page_number, page, page_size는 페이지네이션을 위한 쿼리 파라미터이다. 각각의 역할은 다음과 같다
         - page_number: 페이지네이션 클래스를 선택하는 파라미터이다. 이 파라미터의 값에 따라 사용할 페이지네이션 클래스가 결정된다. 예를 들어, page_number를 지정하면 페이지 번호를 기준으로 페이지네이션을 수행하는 클래스를 사용하게 된다.
         - page: 페이지 번호를 지정하는 파라미터이다. 이 값에 따라 API 요청이 반환하는 페이지가 결정된다. 예를 들어, page=2를 지정하면 API 요청은 두 번째 페이지의 결과를 반환한다.
         - page_size: 한 페이지에 표시할 아이템의 수를 지정하는 파라미터이다. 이 값에 따라 API 요청이 반환하는 페이지의 아이템 수가 결정된다. 예를 들어, page_size=5를 지정하면 API 요청은 한 페이지에 5개의 아이템을 반환한다.

 

      - ProxyPagination 클래스를 사용할 때는 이러한 파라미터들을 사용하여 페이지네이션을 수행할 수 있다.
      - 다음은 URL 예시이다.
         - 페이지네이션 클래스를 'page_number'로, 페이지 번호를 2로, 페이지 크기를 5로 지정한 경우: 

            - http://localhost:8000/api/mymodels/?pagination_class=page_number&page=2&page_size=5

         - 페이지네이션 클래스를 'limit_offset'로, 페이지 번호를 3로, 페이지 크기를 10로 지정한 경우:

            - http://localhost:8000/api/mymodels/?pagination_class=limit_offset&page=3&page_size=10

 

   3) link-header-pagination

      - django-rest-framework-link-header-pagination 패키지에는 GitHub REST API 문서에서 설명한 대로 HTTP 링크 헤더를 통한 페이지네이션을 제공하는 LinkHeaderPagination 클래스가 포함되어 있다.

         - django-rest-framework-link-header-pagination : https://github.com/tbeadle/django-rest-framework-link-header-pagination

         - GitHub REST API documentation : https://docs.github.com/en/rest/using-the-rest-api/using-pagination-in-the-rest-api?apiVersion=2022-11-28

 

 - 공식 사이트 문서 : https://www.django-rest-framework.org/api-guide/pagination/#pagination

 

Pagination - Django REST framework

pagination.py Django provides a few classes that help you manage paginated data – that is, data that’s split across several pages, with “Previous/Next” links. — Django documentation REST framework includes support for customizable pagination styl

www.django-rest-framework.org

 

댓글