改变Django Admin排序整数的方式?

时间:2010-07-13 19:04:50

标签: django sorting django-models django-admin integer

模型的IntegerField带有null=True, blank=True,因此它允许该字段的值为None。对列进行排序时,Nones始终被视为最低值。是否有可能让Django将它们视为最高价值?因此,当按降序排序时,而不是:

100 43 7无

它会:

无100 43 7

我意识到我可以分配一个非常高的数字而不是无,但为了整洁,我想知道是否还有其他选择。

谢谢!

3 个答案:

答案 0 :(得分:1)

Daniel是正确的,因为数据库确定了排序顺序,不同的数据库以不同的方式处理NULL的排序。但是,有一些方法可以让DB为您提供所需的订单。

PostgreSQL非常适合实际允许您在查询中附加“NULLS FIRST”或“NULLS LAST”(ref)。

SELECT * FROM table_name ORDER BY int_field DESC NULLS FIRST;

对于MySQL和SQLite,有一个替代方案(也可以在PostgreSQL中使用),如here所述。基本上,如果你最后想要空值,你可以这样做:

SELECT *, int_field IS NULL AS is_null FROM table_name ORDER BY is_null DESC, int_field DESC;

然而,让Django执行这些查询完全不同。在Django 1.2中,模型管理器现在有一个raw()方法,记录为here,它返回一个RawQuerySet,它类似于QuerySet,但不能堆叠(例如,你不能添加filter()调用在那里)。当然,您可以将查找参数添加到SQL中,而不是堆叠。此功能是否对您有用取决于您要完成的任务。如果您只是想按该顺序获取模型,然后将查询集传递给视图或其他内容,您可以执行以下操作:

YourModel.objects.raw('SELECT *, int_field IS NULL AS is_null FROM table_name ORDER BY is_null DESC, int_field DESC')

如果您希望这是管理员使用的默认排序等,您可能需要采用不同的方法,可能是通过覆盖经理。

答案 1 :(得分:0)

确定排序顺序不是Django,而是数据库。数据库有关于如何对NULL进行排序的规则。

一种(相当复杂)的可能性是实现使用自定义数据库类型以正确顺序排序的custom field。有关如何执行此操作的详细信息可能取决于您的数据库。

答案 2 :(得分:0)

由于我使用的是Django 1.1并且无法使用raw(),最简单的方法是创建一个“int_sort”字段,并使用IntegerField的值填充它,除非遇到None,否则会占用sys.maxint的值。

然后,在admin.py中,我将admin_order_field设置为“int_sort”字段。