Content-Range Django Rest 分页配置

Content-Range configuration for Django Rest Pagination

6.30.15 - 我怎样才能使这个问题更好,对其他人更有帮助?反馈会很有帮助。谢谢!

我需要将 content-range header 发送到 dojo/dgrid 请求:

我找不到任何有关如何执行此操作的示例。我不确定此设置的位置(Content-Range:项目 0-9/*)。我在这个问题上得到了一个很棒的 linkheader 分页示例: 但我不知道如何使它产生 Content-Range 响应。任何接受者或任何人都知道任何好的资源或例子吗??

更新:我正在尝试在 Dojo/grid 中创建分页。我正在使用 server-side api(Django Rest Framework)向 Dojo/Dgrid 提供数据。 Django Rest Framework 在从 Dojo 获得响应时不会自动发送 content-range headers。当格式化为具有分页时,Dojo 发送一个范围请求。我现在不知道如何配置 Django Rest Framework API 在收到来自 Dojo 的请求时发送 content-range header。不幸的是,我正在尝试做一些非常具体的事情,但任何一方的常规设置都不起作用。

如果你说的是在回复中提供 Content-Range,我在 an answer to another SO question 中提到过(我相信这也可能来自你的团队?),有一个替代方案 header:如果您的响应格式是 object(不仅仅是项目数组),它可以指定 total 属性 来指示项目总数。

再次在 DRF documentation 寻找几分钟,看来应该可以自定义响应的格式。

根据文档和 reading the source of LimitOffsetPagination (which you want to be using to work with dstore, as already discussed in a previous question),如果我不得不大胆猜测,您应该能够执行以下操作 server-side:

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 的预期。 (就 dstore 而言,nextprevious 完全没有必要,因此您可以带走或留下它们,具体取决于您在其他地方是否需要它们。)

响应中包括Content-RangeHeader:

您只需要创建一个 headers 字典,其中 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)

假设这是 header 收到的:

Content-Range: items 0-9/50 

这表示返回了总数 50 中的前 10 项。

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

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