Django-tables2: 允许降序列在列底部放置空值

创建于 2018-08-02  ·  6评论  ·  资料来源: jieter/django-tables2

在处理 #595 和 #597 中的降序列时,我遇到了一些似乎有点偏离的降序排序行为。

考虑这样一组数据:

| 记录 | 价值 |
| --- | --- |
| 一个 | 3 |
| 乙 | 1 |
| C | - |
| D | - |

按升序对 Value 列进行排序时,空值会被推到列表的底部:

| 记录 | 价值 |
| --- | --- |
| 乙 | 1 |
| 一个 | 3 |
| C | - |
| D | - |

但是当按降序排序时,空值被放置在列表的顶部:

| 记录 | 价值 |
| --- | --- |
| C | - |
| D | - |
| 一个 | 3 |
| 乙 | 1 |

在某些情况下,用户在降序排序时希望“忽略”空值,从而将它们推到列表的底部,与升序相同。 这能做到吗?

最有用的评论

哈,好吧,我可能已经说服自己不需要 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。

所有6条评论

你看到#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 :)

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

brianmay picture brianmay  ·  6评论

wtfrank picture wtfrank  ·  32评论

applegrew picture applegrew  ·  17评论

blite picture blite  ·  3评论

mpasternak picture mpasternak  ·  9评论