paginations.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. if request.query_params.get(self.page_query_param):
  20. page_number = int(request.query_params.get(self.page_query_param))
  21. else:
  22. page_number = 1
  23. if page_number in self.last_page_strings:
  24. page_number = int(paginator.num_pages)
  25. page_number = min(page_number, paginator.num_pages)
  26. try:
  27. self.page = paginator.page(page_number)
  28. except InvalidPage as exc:
  29. msg = self.invalid_page_message.format(
  30. page_number=page_number, message=str(exc)
  31. )
  32. raise NotFound(msg)
  33. if paginator.num_pages > 1 and self.template is not None:
  34. # The browsable API should display pagination controls.
  35. self.display_page_controls = True
  36. self.request = request
  37. return list(self.page)
  38. def get_paginated_response(self, data):
  39. return Response({
  40. 'total_page': self.page.paginator.num_pages,
  41. 'total_counts': self.page.paginator.count,
  42. 'page_size': self.page.paginator.per_page,
  43. 'current_page': self.page.number,
  44. 'current_counts': len(data),
  45. 'items': data
  46. })