Как динамически установить порядок параметров сортировки с null last в django API?
Я получаю sort_by и sort_order в качестве параметров запроса в наш Django API. Изначально логика выглядит следующим образом:
class Users:
queryset = ...
sort_by = self.request.query_params.get('sort_by')
sort_order = self.request.query_params.get('sort_order')
if sort_order == "desc":
sort_by = "-" + sort_by
def get_queryset(self):
return queryset.order_by(sort_by, "id")
Проблема, с которой я столкнулся, заключается в том, что когда я сортирую по убыванию по определенному параметру, нулевые значения будут отображаться первыми. Я хочу, чтобы все нулевые значения были последними, независимо от того, сортирую ли я по возрастанию или убыванию. Я видел, что есть функция из документации Django здесь , но это означает, что мне придется вызывать разные функции для сортировки по возрастанию или по убыванию, что сделает ее неэлегантной:
if sort_order == 'desc':
return queryset.order_by(F(sort_by).desc(nulls_last=True), "id")
else:
return queryset.order_by(F(sort_by).asc(nulls_last=True), "id")
Есть ли лучший способ сделать это?
if not sort_order:
sort_order = "asc"
return queryset.order_by(getattr(F(sort_by),sort_order))(nulls_last=True), "id")
Я думаю?
Хотя я не уверен, что это более элегантно, чем просто использовать 2 вызова...
я также не уверен, в каком порядке
queryset.order_by(F("-pk").asc()) даст?
это может быть то же самое, что order_by(F("pk").desc())?
Я бы, наверное, просто сделал что-то вроде
order_by_clause = F(sort_by).asc(nulls_last=True)
if sort_order == "desc":
order_by_clause = F(sort_by).desc(nulls_last=True)
return queryset.order_by(order_by_clause,"id")
Если бы это был я