1.在响应中包含Link Header:
要在响应中包含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 Header:
您也可以发送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。这表示返回总数中的前 10 个项目50。
您也可以使用* 代替总数。如果计算总计很昂贵,则项目的数量。
Content-Range: items 0-9/* # Use this if total is expensive to calculate