Обновление два
Так что, к сожалению, идея @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, но, возможно, я смотрю не в ту область.Становится тупым на том, что я должен сделать.Есть идеи?