【问题标题】:Django queryset place of None/Null in orderby in PostgresqlDjango queryset place of None/Null in orderby in Postgresql
【发布时间】:2016-01-14 17:55:17
【问题描述】:

我有一个按 -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 的末尾?

【问题讨论】:

标签: python django postgresql django-queryset


【解决方案1】:

这样的事情应该可以工作。

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__isnull=True, then=Value(1)),
        When(time_returned__isnull=False, then=Value(0)),
        output_field=IntegerField(),
    )
).order_by('nulls_last', '-time_returned')

从这里:Django order_by specific order

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 2022-01-19
    • 2022-12-01
    • 2019-08-08
    • 2022-12-01
    • 2022-11-30
    • 2019-03-29
    • 2021-12-21
    相关资源
    最近更新 更多