본문 바로가기

Dev./Django.

[Django] DRF로 pagination 적용하기 -PageNumberPagination

728x90
반응형

페이지네이션(Pagination)

구글에 DRF pagination으로 검색을 하면 많은 결과가 한번에 보여지는 것이 아니라 다음과 같이 페이지별로 보여진다. 결과가 약 만개라고 가정했을 때 매번 전체 결과를 가져오면 속도가 굉장히 느리고 유저입장에서는 불편할 것이다. 따라서 전체 데이터에서 지정된 값 만큼 데이터를 나눠서 가져오는 방식을 페이지네이션 이라고 한다.

http://127.0.0.1:8000/user/?page=2

 

DRF에서는 PageNumberPagination, LimitOffsetPagination, CursorPagination 와 같은 페이지네이션 기능을 제공하고 있다. 이 글에서는 실제 사용을 한 PageNumberPagination로 페이지네이션을 적용하는 것에대해서만 작성하려고 한다.

PageNumberPagination

PageNumberPagination은 page/ page_size 인자를 통해 페이징 처리를 한다

 

from rest_framework.pagination import PageNumberPagination

 

PageNumberPagination은 URL 쿼리스트링으로  page번호를 받는 형식으로 되어있다. 다음과 같은 주소로 요청을 보내면 두번째 페이지의 유저들이 보여질 것이다.

http://127.0.0.1:8000/user/?page=2

Custom Pagination Class

페이지네이션 클래스를 커스텀 하기 위해 앱에 paginations 파일을 생성하고 커스텀 페이지네이션 클래스에 PageNumberPagination을 상속받아준다.

 

from rest_framework.pagination import PageNumberPagination

class BasePagination(PageNumberPagination):
 	page_size = 8
    	max_page_size = 100
    	page_size_query_param = 'page'

        def get_paginated_response(self, data):
            return Response(OrderedDict([
                ('number', self.page.number),
                ('per_page', self.page.paginator.per_page),
                ('count', self.page.paginator.count),
                ('next', self.page.number+1 if self.page.number < self.page.paginator.num_pages else None),
                ('previous', self.page.number-1 if self.page.number > 1 else None),
                ('results', data)
            ]))
  • page_size - 각 페이지네이션의 크기 결정
  • max_page_size - 최대 허용 요청 페이지 크기를 나타내는 숫자 값 , page_size_query_param 설정 되어야만 유효
  • page_size_query_param - 클라이언트가 요청별로 페이지 크기를 설정할 수 있도록 하는 쿼리 매개변수의 이름
    • page_size_query_param를 설정했을 때 max_page_size 값보다 큰 값을 넣어도 설정해둔 max_page_size값 만큼의 객체가 리턴된다.

get_paginated_response

페이지네이션 리턴시 보여줄 데이터 객체를 커스텀하는 함수이다. 재정의하여 개수, 이전 링크 및 다음 링크 등을 지정해줄 수 있다.

page.number, page.paginator.per_page 와 같은 설명은 https://docs.djangoproject.com/en/4.1/ref/paginator/

에서 확인하면 된다.

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

원하는 클래스의 pagination_class로 만들어둔 커스텀 페이지네이션 클래스를 등록해주면 끝이다. 단 여기서 주의할 점이 페이지네이션이 필요한 클래스의 모델은 반드시 일정한 기준으로  레코드 정렬 후 페이지네이션 수행해야 한다는 점이다. 

728x90
반응형