Django Rest Pagination的内容范围配置

时间:2015-06-17 19:51:02

标签: dojo pagination django-rest-framework http-content-range

6.30.15 - 我如何使这个问题更好,更有益于其他人?反馈会有所帮助。谢谢!

我需要向dojo / dgrid请求发送内容范围标头:enter image description here

我找不到任何如何做到这一点的例子。我不确定此设置的位置(内容范围:项目0-9 / *)。我已经在这个问题上获得了一个很好的linkheaderpagination示例:Django Rest Framework Pagination Settings - Content-Range但我不知道如何使这项工作产生一个Content-Range响应。任何人或任何人都知道任何好的资源或例子吗?

更新:我正在尝试在Dojo / grid中创建分页。我正在使用服务器端api(Django Rest Framework)向Dojo / Dgrid提供数据。当Django Rest Framework从Dojo获得响应时,它不会自动发送内容范围标头。在格式化为分页时,Dojo会发送范围请求。我现在不知道将Django Rest Framework API配置为在收到Dojo请求时发送内容范围标头。不幸的是,我正在尝试做一些非常具体的事情,只是两边的一般设置都不起作用。

2 个答案:

答案 0 :(得分:2)

在回复中包含Content-Range标题:

您只需创建一个标题字典,其中包含Content-Range作为键和值,即返回的项目数和总项数。

例如:

class ContentRangeHeaderPagination(pagination.PageNumberPagination):
    """
    A custom Pagination class to include Content-Range header in the
    response.
    """

    def get_paginated_response(self, data):
        """
        Override this method to include Content-Range header in the response.

        For eg.:
        Sample Content-Range header value received in the response for 
        items 11-20 out of total 50:

                Content-Range: items 10-19/50
        """

        total_items = self.page.paginator.count # total no of items in queryset
        item_starting_index = self.page.start_index() - 1 # In a page, indexing starts from 1
        item_ending_index = self.page.end_index() - 1

        content_range = 'items {0}-{1}/{2}'.format(item_starting_index, item_ending_index, total_items)      

        headers = {'Content-Range': content_range} 

        return Response(data, headers=headers)

假设这是收到的标题:

Content-Range: items 0-9/50 

这表示从总50中返回的前10个项目。

注意:如果计算总费用很高,您也可以使用*代替total_items

Content-Range: items 0-9/* # Use this if total is expensive to calculate

答案 1 :(得分:1)

如果您正在谈论在回复中提供内容范围,我在an answer to another SO question(我认为可能也来自您的团队?)中提到过,此标题有一个替代方案:如果您的回复格式是一个对象(不仅仅是一个项目数组),它可以指定一个total属性来表示项目的总数。

再次在DRF documentation查找几分钟,似乎可以自定义响应的格式。

基于文档和reading the source of LimitOffsetPagination(您希望用于与dstore一起使用,如previous question中已经讨论过的那样),如果我不得不采取疯狂猜测,您应该能够执行以下服务器端:

class CustomPagination(pagination.LimitOffsetPagination):
    def get_paginated_response(self, data):
        return Response(OrderedDict([
            ('total', self.count),
            ('next', self.get_next_link()),
            ('previous', self.get_previous_link()),
            ('items', data)
        ]))

这有意将计数分配给total,将数据分配给items以符合dstore/Request的期望。 (就{d}而言,nextprevious完全没有必要,因此您可以接受或离开它们,具体取决于您是否在其他地方使用它们。)