6.30.15 - 我如何使这个问题更好,更有益于其他人?反馈会有所帮助。谢谢!
我使用DRF作为Dojo / Dgrid Web应用程序的服务器端。 Dojo需要来自服务器的内容范围或范围响应。目前它不发送任何内容,因此dgrid.grid的分页无法正常工作。
在DRF文档中,它指出了“响应标头中包含的分页链接,例如内容范围或链接”。但是没有给出如何设置DRF API来执行此操作的明确流程。我仍然是Web应用程序开发的新手。任何帮助将不胜感激!
答案 0 :(得分:4)
<强> 1。在回复中包含Link
标题:
要在响应中包含Link
标头,您需要创建一个自定义分页序列化程序类,这应该是pagination.BasePagination
的子类并覆盖get_paginated_response(self, data)
方法。
示例(摘自docs):
假设我们想要使用包含Link
标头中的下一个和上一个链接的修改格式替换默认分页输出样式,我们会覆盖get_paginated_response()
。
class LinkHeaderPagination(pagination.PageNumberPagination):
def get_paginated_response(self, data):
next_url = self.get_next_link()
previous_url = self.get_previous_link()
if next_url is not None and previous_url is not None:
link = '<{next_url}; rel="next">, <{previous_url}; rel="prev">'
elif next_url is not None:
link = '<{next_url}; rel="next">'
elif previous_url is not None:
link = '<{previous_url}; rel="prev">'
else:
link = ''
link = link.format(next_url=next_url, previous_url=previous_url)
headers = {'Link': link} if link else {}
return Response(data, headers=headers)
在此之后,我们需要在我们的设置中包含此分页类,以便DRF使用它而不是默认的分页类。
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'my_project.apps.core.pagination.LinkHeaderPagination',
'PAGE_SIZE': 100
}
列表端点的API响应现在将包含Link
标头。
<强> 2。在回复中包含Content-Range
标题:
您也可以发送Content-Range
标题而不是Link
。只需创建一个标题字典,其中包含Content-Range
作为键和值,即返回的项目数和总项数。
例如:
class ContentRangeHeaderPagination(pagination.PageNumberPagination):
def get_paginated_response(self, data):
total_items = self.page.paginator.count
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
这告诉我们,响应的Content-Range
标头的值为items 0-9/50
。这表示从总50
中返回的前10个项目。
您也可以使用*
代替总数。如果计算总数是昂贵的。
Content-Range: items 0-9/* # Use this if total is expensive to calculate
答案 1 :(得分:0)
DRF建议在其documentation:django-rest-framework-link-header-pagination
中使用第三方软件包。应该遵循与Github API相同的路径,这基本上是执行其他答案所建议的正确方法。
以下是示例链接标头,摘自Github的API指南:
Link: <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=15>; rel="next",
<https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34>; rel="last",
<https://api.github.com/search/code?q=addClass+user%3Amozilla&page=1>; rel="first",
<https://api.github.com/search/code?q=addClass+user%3Amozilla&page=13>; rel="prev"
我还没有尝试过该软件包,但是一旦完成,我会报告。