如何在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")
如果是我
我正在接收 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")
如果是我