| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- # 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)
- page_number = int(request.query_params.get(self.page_query_param, 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
- })
|