pagination.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: Allen
  4. @Created on: 2023/10/18
  5. """
  6. from collections import OrderedDict
  7. from django.core import paginator
  8. from django.core.paginator import Paginator as DjangoPaginator, InvalidPage
  9. from rest_framework.pagination import PageNumberPagination
  10. from rest_framework.response import Response
  11. class CustomPagination(PageNumberPagination):
  12. page_size = 10
  13. page_size_query_param = "limit"
  14. max_page_size = 999
  15. django_paginator_class = DjangoPaginator
  16. def paginate_queryset(self, queryset, request, view=None):
  17. """
  18. Paginate a queryset if required, either returning a
  19. page object, or `None` if pagination is not configured for this view.
  20. """
  21. empty = True
  22. page_size = self.get_page_size(request)
  23. if not page_size:
  24. return None
  25. paginator = self.django_paginator_class(queryset, page_size)
  26. page_number = request.query_params.get(self.page_query_param, 1)
  27. if page_number in self.last_page_strings:
  28. page_number = paginator.num_pages
  29. try:
  30. self.page = paginator.page(page_number)
  31. except InvalidPage as exc:
  32. # msg = self.invalid_page_message.format(
  33. # page_number=page_number, message=str(exc)
  34. # )
  35. # raise NotFound(msg)
  36. empty = False
  37. pass
  38. if paginator.num_pages > 1 and self.template is not None:
  39. # The browsable API should display pagination controls.
  40. self.display_page_controls = True
  41. self.request = request
  42. if not empty:
  43. self.page = []
  44. return list(self.page)
  45. def get_paginated_response(self, data):
  46. code = 2000
  47. msg = 'success'
  48. res = {
  49. "page": int(self.get_page_number(self.request, paginator)) or 1,
  50. "total": self.page.paginator.count if self.page else 0,
  51. "limit": int(self.get_page_size(self.request)) or 10,
  52. "is_next": self.page.has_next(),
  53. "is_previous": self.page.has_previous(),
  54. "data": data
  55. }
  56. if not data:
  57. code = 2000
  58. msg = "暂无数据"
  59. res['data'] = []
  60. return Response(OrderedDict([
  61. ('code', code),
  62. ('msg', msg),
  63. ('data', res),
  64. ]))