在Postgresql中按顺序的Django queryset place of None / Null

时间:2015-10-16 04:41:27

标签: python django postgresql django-queryset

我有一个查询集,我按-DateTimeField

排序

模特:

class QuestSubmission(models.Model):
    quest = models.ForeignKey(Quest)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, 
    ...
    time_returned = models.DateTimeField(null=True, blank=True)

查询集:

QuestSubmission.objects.all().order_by('-time_returned')

在我的sqlite3测试中,此顺序最新到最旧,然后是None / Null条目

但是在我的Postgresql服务器上,顺序是None / Null,然后是最新到最旧的。

如何让我的postgresql order_by将None / Null值放在末尾,类似于sqlite3?

1 个答案:

答案 0 :(得分:0)

这样的事情应该有效。

select * from dude order by case when date is null then 1 else 0 end, date desc;
 test  |    date    
-------+------------
 test2 | 2001-01-04
 test2 | 2001-01-03
 test2 | 2001-01-02
 test2 | 2001-01-01
 test  | 
 test2 | 

示例:

from django.db.models import Case, When, Value, IntegerField

SomeModel.objects.annotate(
    nulls_last=Case(
        When(time_returned__is_null=True, then=Value(1)),
        When(time_returned__is_null=False, then=Value(0)),
        output_field=IntegerField(),
    )
).order_by('nulls_last', '-time_returned')

从这里开始:Django order_by specific order