Как динамически установить порядок параметров сортировки с 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")

Если бы это был я

Вернуться на верх