Django REST分页相对URL而不是ListAPIView中的绝对URL

时间:2014-11-12 20:06:14

标签: django pagination django-rest-framework

Django Rest Framework generic.ListAPIView将next& prev参数设置为绝对URL。但我需要将它们设置为相对URL。

我需要返回JSON,如下所示

# {'count': 4, 'next': '?page=2', 'previous': None, 'results': [u'john', u'paul']}

不喜欢这个

# {'count': 4, 'next': 'http://testserver/foobar?page=2', 'previous': None, 'results': [u'john', u'paul']}

3 个答案:

答案 0 :(得分:1)

这是@iankit suggsted的实现:

from rest_framework.utils.urls import remove_query_param, replace_query_param
class LeadListPagination(PageNumberPagination):
    page_size = 15

    def get_next_link(self):
        if not self.page.has_next():
            return None
        url = self.request.get_full_path()
        page_number = self.page.next_page_number()
        return replace_query_param(url, self.page_query_param, page_number)

    def get_previous_link(self):
        if not self.page.has_previous():
            return None
        url = self.request.get_full_path()
        page_number = self.page.previous_page_number()
        if page_number == 1:
            return remove_query_param(url, self.page_query_param)
        return replace_query_param(url, self.page_query_param, page_number)

答案 1 :(得分:0)

您必须覆盖rest_framework.pagination.NextPageField.to_native()。并在您自己的自定义分页序列化程序中使用它

答案 2 :(得分:0)

在新的分页样式中,您必须覆盖分页类中的get_next_link和get_previous_link方法。

在这些方法中,使用get_full_path()而不是build_absolute_uri()。

虽然最好明确并在响应中返回绝对URL,但有时您希望返回相对URI。