我有以下 django 查询:
views.some_model.objects.all().order_by('start')
这很好用。结果是这样的:
{00:00, 00:30, 02:03, 04:00, 05:33}
如果我需要它从特定时间开始 order_by
并将其余时间发送到最后(也已订购)怎么办?像这样:
{02:03, 04:00, 05:33, 00:00, 00:30}
我知道我可以进行两个查询(一个从我需要的时间开始,另一个从最后一部分开始),但是有没有更Pythonic的方法?
最佳答案
我的第一直觉是使用两个查询。但既然你想探索替代方案,我想出了这个看起来非常难看的查询 -
from django.db.models import Case, When, Value, IntegerField
qs = views.some_model.objects
.annotate(
recent=Case(
When(start__gt=some_date_var,
then=Value(1)),
default=Value(0),
output_field=IntegerField()))
.order_by('-recent', 'start')
基本上,如果开始大于,则首先用 bool 值(我称之为最近)标记进行注释some_date_var(1 表示起始时间较大,0 否则)。现在首先按最近降序排列,然后按开始升序排列
关于python - Django 按时间从特定小时开始排序查询集,最后发送其他结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52764262/