模型的IntegerField
带有null=True, blank=True
,因此它允许该字段的值为None
。对列进行排序时,Nones始终被视为最低值。是否有可能让Django将它们视为最高价值?因此,当按降序排序时,而不是:
100 43 7无
它会:
无100 43 7
我意识到我可以分配一个非常高的数字而不是无,但为了整洁,我想知道是否还有其他选择。
谢谢!
答案 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”字段。