from collections import OrderedDict from django.core.paginator import InvalidPage from rest_framework.pagination import PageNumberPagination from rest_framework.response import Response class CustomPagination(PageNumberPagination): page_size = 9999 page_query_param = 'page' page_size_query_param = 'page_size' max_page_size = 1000 def __init__(self): self.total = 0 def paginate_queryset(self, queryset, request, view=None): page_size = self.get_page_size(request) if not page_size: return None paginator = self.django_paginator_class(queryset, page_size) page_number = self.get_page_number(request, paginator) self.total = paginator.count # # if (total // page_size) == 0: # page_number = 1 # else: # page_number = (total // page_size) if int(page_number) > (total // page_size) + 1 else page_number try: self.page = paginator.page(page_number) except InvalidPage as exc: return [] 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(OrderedDict([ ('total', self.total), ('code', 0), ('message', 'ok'), ('result', data), ]))