首页 > 解决方案 > 如何使用页码创建自定义分页类?

问题描述

我正在尝试创建一个自定义分页类。这是我的尝试:

class CustomPagination(PageNumberPagination):
    
    page_item_count = 10
    page = 1

    def get_paginated_response(self, data):
        
        page = self.page
        next_page = None
        previous_page = None

        if page.has_next():
            next_page = page.next_page_number()
        
        if page.has_previous():
            previous_page = page.previous_page_number()

        return Response({
            "page_count": page.count,
            "result_count": len(data),
            "next": next_page,
            "previous": previous_page,
            "has_next_page": page.has_next(),
            "has_previous_page": page.has_previous(),
            "result": data,
        })

这段代码现在不能正常工作,这不是我想要的。

我想将查询集参数作为 page_item_count 和 page。

我想返回类似的东西:

return Response({
    "page_count": page.count,    # Page count. i.e. there are 100 items, and we show 10 per page, then it must be 10.
    "result_count": len(data),   # object count. i.e. 100
    "next": next_page,    # Next page number. It's a number like 2,3,4,5... Not a link
    "previous": previous_page,    # Prev page number, like 2,3,....
    "has_next_page": page.has_next(),    # boolean
    "has_previous_page": page.has_previous(),    # boolean
    "result": data,    # objects to be returned
})

我怎样才能做到这一点?

标签: pythondjangopagination

解决方案


您不需要为 DRF 分页属性使用不同的名称:

class CustomPagination(PageNumberPagination):
    page_size = 100  # this is equivalent to your 'page_item_count'
    page_size_query_param = 'page_item_count' # this sets the param name for the page size
    max_page_size = 1000

要覆盖分页响应,您可以:

    def get_paginated_response(self, data):
        """
        PageNumberPagination response override
        """
        return Response(OrderedDict([
            ('page_count', self.get_page_size(self.request)), # total # on current page
            ('page_number', int(self.request.query_params.get(self.page_query_param, 1))),
            ('result_count', self.page.paginator.count),     # total # of objects that will be paginated
            ('next', self.get_next_link()),
            ('previous', self.get_previous_link()),
            ('results', data)
        ]))

您实际上不需要在响应中添加布尔字段来检查它是否有下一页,因为nextandprevious字段就足够了。


推荐阅读