# coding:utf-8 from django.core.paginator import InvalidPage from rest_framework.response import Response from rest_framework.pagination import PageNumberPagination from rest_framework.exceptions import NotFound class CustomPagination(PageNumberPagination): page_size = 10 page_query_param = "page" page_size_query_param = "page_size" def paginate_queryset(self, queryset, request, view=None): """ Paginate a queryset if required, either returning a page object, or `None` if pagination is not configured for this view. """ page_size = self.get_page_size(request) if not page_size: return None paginator = self.django_paginator_class(queryset, page_size) if request.query_params.get(self.page_query_param): page_number = int(request.query_params.get(self.page_query_param)) else: page_number = 1 if page_number in self.last_page_strings: page_number = int(paginator.num_pages) page_number = min(page_number, paginator.num_pages) try: self.page = paginator.page(page_number) except InvalidPage as exc: msg = self.invalid_page_message.format( page_number=page_number, message=str(exc) ) raise NotFound(msg) if paginator.num_pages > 1 and self.template is not None: # The browsable API should display pagination controls. self.display_page_controls = True self.request = request return list(self.page) def get_paginated_response(self, data): return Response({ 'total_page': self.page.paginator.num_pages, 'total_counts': self.page.paginator.count, 'page_size': self.page.paginator.per_page, 'current_page': self.page.number, 'current_counts': len(data), 'items': data })