Django CursorPagination для упорядочивания по нескольким полям - PullRequest
0 голосов
/ 03 апреля 2019

Я использую CursorPagination Django DRF для отложенной загрузки моих данных, и в настоящее время моя цель состоит в том, чтобы отсортировать данные по нескольким полям.

Вот так теперь выглядит мой код:

class EndlessPagination(CursorPagination):

    ordering_param = ''

    def set_ordering_param(self, request):
        self.ordering = request.query_params.get(self.ordering_param, None)

        if not self.ordering:
            raise ValueError('Url must contain a parameter named ' + 
                             self.ordering_param)
        if self.ordering.startswith("\"") or self.ordering.endswith("\""):
            raise ValueError('Ordering parameter should not include quotation marks'    

    def paginate_queryset(self, queryset, request, view=None):
        # This function is designed to set sorting param right in the URL
        self.set_ordering_param(request)
        return super(EndlessPagination, self).paginate_queryset(queryset, request, view)

Этот код отлично работает для URL, таких как my_url/sms/270380?order_by=-timestamp, но что если я хочу отсортировать по нескольким полям?

1 Ответ

2 голосов
/ 04 апреля 2019

Используйте str.split() для разделения параметров URL

class EndlessPagination(CursorPagination):
    ordering_param = 'order_by'

    def set_ordering_param(self, request):
        <b>ordering_param_list = request.query_params.get(self.ordering_param, None)

        self.ordering = ordering_param_list.split(',')

        # here, "self.ordering" will be a "list", so, you should update the validation logic</b>
        """
        if not self.ordering:
            raise ValueError('Url must contain a parameter named ' +
                             self.ordering_param)
        if self.ordering.startswith("\"") or self.ordering.endswith("\""):
            raise ValueError('Ordering parameter should not include quotation marks'
        """

    def paginate_queryset(self, queryset, request, view=None):
        # This function is designed to set sorting param right in the URL
        self.set_ordering_param(request)
        return super(EndlessPagination, self).paginate_queryset(queryset, request, view)


Примеры URL
1. my_url/sms/270380?order_by=-timestamp
2. my_url/sms/270380?order_by=-timestamp,name
3. my_url/sms/270380?order_by=-name,foo,-bar


ОБНОВЛЕНИЕ-1

Прежде всего, спасибо вам за предоставленную возможность глубоко копать:)

Как вы сказали, я тоже не видел разделенных запятыми query_params в популярных API .Итак, измените формат URL на что-то вроде

my_url/sms/270380?<b>?order_by=-name&order_by=foo&order_by=-bar</b>
. В это время request.query_params['order_by'] будет список, равный ['-name','foo','-bar'].Таким образом, вы не хотите использовать функцию split(), следовательно, ваш метод set_ordering_param() становится,
def set_ordering_param(self, request):
    <b>self.ordering = request.query_params.get(self.ordering_param, None)</b>
    #...... your other validations
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...