paginations.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. # coding:utf-8
  2. from django.core.paginator import InvalidPage
  3. from rest_framework.response import Response
  4. from rest_framework.pagination import PageNumberPagination
  5. from rest_framework.exceptions import NotFound
  6. class CustomPagination(PageNumberPagination):
  7. page_size = 10
  8. page_query_param = "page"
  9. page_size_query_param = "page_size"
  10. def paginate_queryset(self, queryset, request, view=None):
  11. """
  12. Paginate a queryset if required, either returning a
  13. page object, or `None` if pagination is not configured for this view.
  14. """
  15. page_size = self.get_page_size(request)
  16. if not page_size:
  17. return None
  18. paginator = self.django_paginator_class(queryset, page_size)
  19. page_number = int(request.query_params.get(self.page_query_param, 1))
  20. if page_number in self.last_page_strings:
  21. page_number = int(paginator.num_pages)
  22. page_number = min(page_number, paginator.num_pages)
  23. try:
  24. self.page = paginator.page(page_number)
  25. except InvalidPage as exc:
  26. msg = self.invalid_page_message.format(
  27. page_number=page_number, message=str(exc)
  28. )
  29. raise NotFound(msg)
  30. if paginator.num_pages > 1 and self.template is not None:
  31. # The browsable API should display pagination controls.
  32. self.display_page_controls = True
  33. self.request = request
  34. return list(self.page)
  35. def get_paginated_response(self, data):
  36. return Response({
  37. 'total_page': self.page.paginator.num_pages,
  38. 'total_counts': self.page.paginator.count,
  39. 'page_size': self.page.paginator.per_page,
  40. 'current_page': self.page.number,
  41. 'current_counts': len(data),
  42. 'items': data
  43. })