天天看點

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中調用一下就可以了,這樣就可以實作分頁,第一頁,及最後一頁了。