天天看点

Django restframework 分页配置及自定义第一页,最后一页

setting中:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    # 'PAGE_SIZE': 10,  # 这里的每页最多个数是优先于自定义的。我们自定义了,就不用这个了
}
           

serializers中写

from rest_framework.pagination import PageNumberPagination
from rest_framework.utils.urls import remove_query_param, replace_query_param
class StandartResultsSetPagination(PageNumberPagination):
    """
        配置分页规则, 自定义第一页,最后一页
    """

    page_size = 10   # 每页显示个数
    page_size_query_param = 'page_size'   # 默认
    page_query_param = 'page'   # 默认
    max_page_size = 1000   # 最多页数

    def get_start_link(self):
        """
            第一页
        """
        if not self.page.has_previous():
            return None
        page_number = 1
        url = self.request.build_absolute_uri()
        return replace_query_param(url, self.page_query_param, page_number)

    def get_end_link(self):
        """
            最后一页
        """
        if not self.page.has_next():
            return None
        url = self.request.build_absolute_uri()
        page_number = self.page.paginator.num_pages
        print(page_number)
        return replace_query_param(url, self.page_query_param, page_number)

    def get_paginated_response(self, data):
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('start', self.get_start_link()),
            ('previous', self.get_previous_link()),
            ('next', self.get_next_link()),
            ('end', self.get_end_link()),
            ('results', data)
        ]))
           

使用方法:

views中:

class RegistrationView(viewsets.ModelViewSet):
    """
        pass
    """
    pagination_class = StandartResultsSetPagination  # 使用自定义的分页
           

在每个View中调用一下就可以了,这样就可以实现分页,第一页,及最后一页了。