在处理 #595 和 #597 中的降序列时,我遇到了一些似乎有点偏离的降序排序行为。
考虑这样一组数据:
| 记录 | 价值 |
| --- | --- |
| 一个 | 3 |
| 乙 | 1 |
| C | - |
| D | - |
按升序对 Value 列进行排序时,空值会被推到列表的底部:
| 记录 | 价值 |
| --- | --- |
| 乙 | 1 |
| 一个 | 3 |
| C | - |
| D | - |
但是当按降序排序时,空值被放置在列表的顶部:
| 记录 | 价值 |
| --- | --- |
| C | - |
| D | - |
| 一个 | 3 |
| 乙 | 1 |
在某些情况下,用户在降序排序时希望“忽略”空值,从而将它们推到列表的底部,与升序相同。 这能做到吗?
你看到#529了吗?
哦,我现在看到了。 嗯,也许我也可以考虑为此做一个 PR。
将非常受欢迎!
哈,好吧,我可能已经说服自己不需要 PR。 在我的示例中,可以通过使用order_FOO()
方法和 Django 的nulls_last
参数来实现所需的行为。 像这样:
def order_value(self, QuerySet, is_descending):
if is_descending:
QuerySet = QuerySet.order_by(F('value').desc(nulls_last = True))
else:
QuerySet = QuerySet.order_by(F('value').asc(nulls_last = True))
return (QuerySet,True)
这会导致空值始终排在列的末尾。 这适用于我需要它的情况,因为我可以确保我的数据库始终使用 null 作为空值。
我在值只是空的情况下测试了这个解决方案,但它不起作用。 我怀疑可以通过修改django-tables2
order_by
行为中的某些内容来解决方案,但是如果我们无论如何都在谈论边缘情况,也许 sort-with-nulls-last order_FOO()
解决方法比弄乱源更好。
无论如何,我可以认为我的请求已经结束。 如果其他人吵着要以同样的方式处理严格的空值,也许可以重新访问 PR。
谢谢解释!
感谢这个很好的解决方法@foldedpaper :)
最有用的评论
哈,好吧,我可能已经说服自己不需要 PR。 在我的示例中,可以通过使用
order_FOO()
方法和 Django 的nulls_last
参数来实现所需的行为。 像这样:def order_value(self, QuerySet, is_descending): if is_descending: QuerySet = QuerySet.order_by(F('value').desc(nulls_last = True)) else: QuerySet = QuerySet.order_by(F('value').asc(nulls_last = True)) return (QuerySet,True)
这会导致空值始终排在列的末尾。 这适用于我需要它的情况,因为我可以确保我的数据库始终使用 null 作为空值。
我在值只是空的情况下测试了这个解决方案,但它不起作用。 我怀疑可以通过修改
django-tables2
order_by
行为中的某些内容来解决方案,但是如果我们无论如何都在谈论边缘情况,也许 sort-with-nulls-lastorder_FOO()
解决方法比弄乱源更好。无论如何,我可以认为我的请求已经结束。 如果其他人吵着要以同样的方式处理严格的空值,也许可以重新访问 PR。