首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django按日期排序,但结尾有"None“吗?

Django按日期排序,但结尾有"None“吗?
EN

Stack Overflow用户
提问于 2011-10-13 11:40:15
回答 5查看 18.1K关注 0票数 54

我有一个工单模型,当工单是需要的时候,我有一个字段。要获取包含早期需要的工作订单的列表,我执行以下操作:

wo = Work_Order.objects.order_by('dateWORequired')

这可以很好地工作,但前提是该字段中确实存在值。如果没有必需的日期,则值为None。然后,工单列表将所有的None放在顶部,然后按正确的顺序排列剩余的工单。

我怎么才能把None放在底部呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-13 12:11:35

代码语言:javascript
复制
q = q.extra(select={
        'date_is_null': 'dateWORequired IS NULL',
    },
    order_by=['date_is_null','dateWORequired'],
)

在order_by部分的date_is_null之前可能需要一个-,但这就是控制行为的方式。

票数 41
EN

Stack Overflow用户

发布于 2017-06-24 07:20:58

Django 1.11将其添加为原生功能。这有点费解。It is documented

排序时只有一个字段,升序的

代码语言:javascript
复制
wo = Work_Order.objects.order_by(F('dateWORequired').asc(nulls_last=True))

使用排序两个字段,均为降序

代码语言:javascript
复制
wo = Work_Order.objects.order_by(F('dateWORequired').desc(nulls_last=True), F('anotherfield').desc(nulls_last=True))
票数 70
EN

Stack Overflow用户

发布于 2016-03-24 05:13:33

当问题被问到时,这是不可用的,但从Django 1.8开始,我认为这是最好的解决方案:

代码语言:javascript
复制
from django.db.models import Coalesce, Value
long_ago = datetime.datetime(year=1980, month=1, day=1)
Work_Order.objects.order_by('dateWORequired')
MyModel.objects.annotate(date_null=
    Coalesce('dateWORequired', Value(long_ago))).order_by('date_null')

Coalesce选择第一个非null值,因此您将创建一个date_null作为排序依据,该值只是dateWORequired,但null很久以前就被替换为日期了。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7749216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档