Пользовательский порядок в Django в URL-запросах - PullRequest
0 голосов
/ 18 декабря 2018

Обновление два

Так что, к сожалению, идея @Reza Torkaman Ahmadi в итоге не сработала.Это потому, что наша программа имеет функцию фильтрации, которая опирается на get_queryset, и переопределение метода get_queryset в наших представлениях испортило эту функцию.

Итак, мой партнер и я обсуждали это, и вот что он придумал.

class OrderbyFilter(filters.OrderingFilter): def get_ordering(self, request, queryset, view): """ Ordering is set by a comma delimited ?$orderby=... query parameter. Extends the OrderingFilter of the django rest framework to redefine ordering parameters to "asc" and "desc". """ params = request.query_params.get(self.ordering_param) if params: field_queries = [param.strip() for param in params.split(',')] fields = [] for field_query in field_queries: field_query = field_query.split() if len(field_query) <= 2: while "asc" in field_query: field_query.remove("asc") for i, field in enumerate(field_query): if field == "desc": field_query[i-1] = "-" + field_query[i-1] while "desc" in field_query: field_query.remove("desc") fields.append(field_query[0]) else: fields.append([param.strip() for param in params.split(',')]) ordering = self.remove_invalid_fields(queryset, fields, view, request) if ordering: return ordering return self.get_default_ordering(view)

По сути, эта функция переопределяет исходный код Django REST,в частности, функция get_ordering в OrderingFilter.Что он делает, если «asc» находится в запросе после поля, он удаляет его и обрабатывает как нормальный (для обычного упорядочения по возрастанию)

В противном случае, если есть «desc», он удаляет «desc»', и применяет дефис.

Обновление Отвечено.Применил идею @Reza Torkaman Ahmadi, и она прекрасно работает после модификации, чтобы соответствовать моим потребностям.Спасибо, приятель!

В настоящее время в инфраструктуре отдыха API Django, если пользователь хочет видеть список чего-либо в порядке возрастания или убывания, он должен сделать следующее:

'Datastream & order_by = -name 'показывает имена в порядке убывания' Datastream & order_by = name 'показывает имена в порядке возрастания.

Я хочу сделать пользовательский запрос, в котором ввод в' Datastream & order_by = asc name 'упорядочит имена в порядке возрастания, а'desc name 'сделает это в порядке убывания.

Я просмотрел некоторые исходные коды для среды REST, но, возможно, я смотрю не в ту область.Становится тупым на том, что я должен сделать.Есть идеи?

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете сделать это по-своему.например:

class DatastreamViewSet(ModelViewSet):

    def get_queryset(self):
        queryset = super(DatastreamViewSet, self).get_queryset()

        order_by = self.request.query_params.get('order_by', '')
        if order_by:
            order_by_name = order_by.split(' ')[1]
            order_by_sign = order_by.split(' ')[0]
            order_by_sign = '' if order_by_sign == 'asc' else '-'
            queryset = queryset.order_by(order_by_sign + order_by_name)

        return queryset

это будет искать параметр запроса order_by, если он задан, затем разделит его на пробел, первый будет указывать на использование знака + или - в фильтре order_by, а второй будетбыть именем этого.так что сложите все вместе и создайте текст, передайте его order_by и все готово.

например:

?order_by=asc name

будет таким же в django =>

return queryset.order_by('name')
...