如何在django API中动态设置最后一个为null的排序参数顺序?

How to dynamically set the sorting parameter order with null last in 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 文档中有一个函数 here 但这意味着我必须有一个不同的函数调用来确定它是升序还是降序,这会使它不优雅:

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")

如果是我