按日期排序的模型的默认排序,首先出现空值

时间:2015-07-06 05:19:51

标签: python django django-models

在Django中,您可以定义default ordering of models with the ordering meta option

如果你的模特是:

class Event(models.Model):
    title = models.TextField()
    start_date = models.DateField()
    end_date = models.DateField(null=True, blank=True)

我们可以修复模型的顺序,如下所示:

    class Meta:
        ordering = ['-end_date','-start_date']

哪个会将具有最新结束日期的事件放在第一位,而对于具有最近开始日期的事件进行平局排序的情况。

但是,某些事件可能仍在发生,因此可以为end_date。这些是系统中最近发生的最新事件,但这些事件是在之后其他所有事件中订购的。

在Django中,如何在日期字段中指定ordering以使其下降,但首先显示null个字段?

如果这不可能,我如何编写该字段的查询以获得相同的效果?

2 个答案:

答案 0 :(得分:1)

我查看了Django的数据库代码,看起来Django没有提供任何钩子来自定义'ordering'元选项的处理,它所做的就是用{{1}生成SQL的ORDER BY部分你提供的。我不知道是否有任何数据库允许用户自定义特定数据类型的比较功能。

如果做不到这一点,我会在解决问题时看到一些替代方案:

  1. 删除排序选项,获取未排序的事件并在python中排序。
  2. 通过2个查询获取活动。获取未完成的事件(end_time = NULL)和已完成的事件(end_time!= NULL),如果业务逻辑可能需要将两个组分开,这是有意义的。
  3. 如果订购必须在DB中进行。在end_date中添加一个默认值,例如“2099-01-01”,它可以保证正确的排序。

答案 1 :(得分:0)

我知道我参加聚会迟到了,但我刚刚遇到了这个完全相同的问题,解决方案是使用 query expressions 中所述的 docs,如下所示:

ordering = (F("end_date").desc(nulls_first=True))