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 而言,next
和 previous
完全没有必要,因此您可以带走或留下它们,具体取决于您在其他地方是否需要它们。)
响应中包括Content-Range
Header:
您只需要创建一个 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
6.30.15 - 我怎样才能使这个问题更好,对其他人更有帮助?反馈会很有帮助。谢谢!
我需要将 content-range header 发送到 dojo/dgrid 请求:
我找不到任何有关如何执行此操作的示例。我不确定此设置的位置(Content-Range:项目 0-9/*)。我在这个问题上得到了一个很棒的 linkheader 分页示例:
更新:我正在尝试在 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 而言,next
和 previous
完全没有必要,因此您可以带走或留下它们,具体取决于您在其他地方是否需要它们。)
响应中包括Content-Range
Header:
您只需要创建一个 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