
페이지네이션(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로 만들어둔 커스텀 페이지네이션 클래스를 등록해주면 끝이다. 단 여기서 주의할 점이 페이지네이션이 필요한 클래스의 모델은 반드시 일정한 기준으로 레코드 정렬 후 페이지네이션 수행해야 한다는 점이다.
'Dev. > Django.' 카테고리의 다른 글
| [DRF] Serialization / Deserialization 동작 변경 - to_internal_value와 to_representation (0) | 2023.04.17 |
|---|---|
| [Django] ManyToMany 모델 인스턴스 생성 및 삭제하기- add, clear (0) | 2023.04.14 |
| [Django] Django에서 fixture 사용 (0) | 2023.03.31 |
| [Django] JSON WebToken - Simple JWT (0) | 2023.03.30 |
| [Django] Django Middleware (0) | 2023.03.16 |