【问题标题】:Django REST pagination relative URL instead of absolute URL in ListAPIViewDjango REST分页相对URL而不是ListAPIView中的绝对URL
【发布时间】:2015-01-09 19:34:09
【问题描述】:

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']}

【问题讨论】:

    标签: django pagination django-rest-framework


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这是@iankit 建议的实现:

      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)
      

      【讨论】:

        【解决方案3】:

        您将不得不覆盖rest_framework.pagination.NextPageField.to_native()。并在你自己的自定义分页序列化器中使用它

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-11
          • 2014-07-18
          • 2011-04-29
          • 2020-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多