Относительный URL-адрес разбиения на страницы Django REST вместо абсолютного URL-адреса в ListAPIView

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

person brsbilgic    schedule 12.11.2014    source источник


Ответы (3)


Вот реализация, предложенная @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)
person dan-klasson    schedule 15.01.2018

В новых стилях пагинации вам придется переопределить методы get_next_link и get_previous_link в классе пагинации.

В этих методах используйте get_full_path() вместо build_absolute_uri().

Хотя всегда лучше быть явным и возвращать абсолютные URL-адреса в ответе, все же бывают случаи, когда вы хотели бы вернуть относительные URI.

person iankit    schedule 19.02.2016

Вам придется перезаписать rest_framework.pagination.NextPageField.to_native(). И используйте его в своем собственном сериализаторе разбивки на страницы.

person timop    schedule 13.11.2014