공식문서 - Generic views
공식문서 - Pagination

Pagenation은 결과가 너무 많을 때, 데이터를 Page로 나누는 기법이다. GenericAPIView 또는 Viewset을 상속하는 경우 간편하게 사용할 수 있다. GenericAPIView의 속성 중에서 Pagination 기능을 사용한다.

  • Pagination:
    • pagination_class - The pagination class that should be used when paginating list results. Defaults to the same value as the DEFAULT_PAGINATION_CLASS setting, which is rest_framework.pagination.PageNumberPagination. Setting pagination_class=None will disable pagination on this view.

1. Setting the Pagination Style


DEFAULT_PAGINATION_CLASS와 PAGE_SIZE 속성을 지정해주면 된다.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.{default API}',
    'PAGE_SIZE': 10
}

2. API Reference


1. PageNumberPagination

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

Request

GET https://localhost:8000/api/post/?page=4

Response

HTTP 200 OK
{
    "count": 3081
    "next": "https://localhost:8000/api/post/?page=5",
    "previous": "https://localhost:8000/api/post/?page=3",
    "results": [
      10개의 데이터
    ]
}
  • 전체 데이터 개수 (count)와 next, previous url, 그리고 PAGE_SIZE 만큼의 데이터의 응답을 반환한다.

2. LimitOffsetPagination

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'
}

Request

GET https://localhost:8000/api/post/?limit=2&offset=3

Response

HTTP 200 OK
{
    "count": 3081
    "next": "GET https://localhost:8000/api/post/?limit=2&offset=1",
    "previous": "GET https://localhost:8000/api/post/?limit=2&offset=5",
    "results": [
       …
    ]
}

3. 적용

GenericAPIView 속성 중 Pagination 속성이 있었다. 따라서 이를 상속하면 pagination_class를 별다른 처리없이 사용할 수 있다. 여러 뷰 클래스들 중에서 serialize화된 쿼리셋을 반환하는 ListAPIView 클래스를 사용한다.

from rest_framework import generics
from rest_framework.pagination import PageNumberPagination

class PostView(generics.ListAPIView):
  queryset = Post.objects.all()
  serializer_class = PostSerializers
  pagination_class = PageNumberPagination