Django Rest框架分页设置 - 内容范围

时间:2015-06-17 17:36:26

标签: django pagination django-rest-framework

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

我使用DRF作为Dojo / Dgrid Web应用程序的服务器端。 Dojo需要来自服务器的内容范围或范围响应。目前它不发送任何内容,因此dgrid.grid的分页无法正常工作。

enter image description here

在DRF文档中,它指出了“响应标头中包含的分页链接,例如内容范围或链接”。但是没有给出如何设置DRF API来执行此操作的明确流程。我仍然是Web应用程序开发的新手。任何帮助将不胜感激!

2 个答案:

答案 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标头。

pag

<强> 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建议在其documentationdjango-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"

我还没有尝试过该软件包,但是一旦完成,我会报告。