我有一个工单模型,当工单是需要的时候,我有一个字段。要获取包含早期需要的工作订单的列表,我执行以下操作:
wo = Work_Order.objects.order_by('dateWORequired')
这可以很好地工作,但前提是该字段中确实存在值。如果没有必需的日期,则值为None。然后,工单列表将所有的None放在顶部,然后按正确的顺序排列剩余的工单。
我怎么才能把None放在底部呢?
发布于 2011-10-13 12:11:35
q = q.extra(select={
'date_is_null': 'dateWORequired IS NULL',
},
order_by=['date_is_null','dateWORequired'],
)在order_by部分的date_is_null之前可能需要一个-,但这就是控制行为的方式。
发布于 2017-06-24 07:20:58
Django 1.11将其添加为原生功能。这有点费解。It is documented。
排序时只有一个字段,升序的
wo = Work_Order.objects.order_by(F('dateWORequired').asc(nulls_last=True))使用排序两个字段,均为降序
wo = Work_Order.objects.order_by(F('dateWORequired').desc(nulls_last=True), F('anotherfield').desc(nulls_last=True))发布于 2016-03-24 05:13:33
当问题被问到时,这是不可用的,但从Django 1.8开始,我认为这是最好的解决方案:
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很久以前就被替换为日期了。
https://stackoverflow.com/questions/7749216
复制相似问题