[DRF] 공식 문서 - pagination 정리
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
'Django REST Framework > DRF 일반' 카테고리의 다른 글
[DRF] 공식 문서 - Permissions 정리 (0) | 2024.01.20 |
---|---|
[DRF] 공식 문서 - Authentication 정리 (0) | 2024.01.19 |
[DRF] 공식 문서 - Filtering 정리 (0) | 2024.01.18 |
[DRF] 공식 문서 - Routers 정리 (0) | 2024.01.17 |
[DRF] 공식 문서 - validators 정리 (2) | 2024.01.16 |
댓글