我有一个模型(代表'工作'),其中包含名为 date_created 的 DateTimeField 。我有另一个名为 date_modified 。
我想按 -date_modified 排序,以便最近修改的“作业”位于我的列表顶部。问题是每次更新时间戳时,多个正在运行的作业将继续重新排序。如果 date_modified 字段的排序方式好像是 DateField ,那么我可以先对“今天”修改过的所有“作业”进行排序,然后排序第二个值(如date_created),以便在修改时间戳时不会更改列表中的位置。
这就是我现在所拥有的:
:post
我发现了一篇相关的文章,但似乎已经过时了1.9版: Django sorting by date(day)
更新
我正在考虑的当前修复是:
queryset = DataCollection.objects.all().order_by('-date_modified','-date_created')
它与@lampslave建议的最相似,但它使用的是extra方法,将来会被弃用...我不认为我会升级到更高版本的Django很快,但这让我的胃口有点不稳定。
答案 0 :(得分:2)
我会得到查询集,然后在这种情况下在视图中对其进行排序。
sorted(DataCollection.objects.all(), key = lambda x: x.date_modified.date(), reverse = True)
要按两个键排序,您可以使用attrgetter,如HowTo / Sorting文档中所述。
答案 1 :(得分:0)
如果您的数据库支持datetime_to_date转换,您可以尝试这样的事情:
DataCollection.objects.all().annotate(date_created__date=RawSQL('DATE(date_created)', ())).order_by('-date_created__date')
答案 2 :(得分:0)
我认为souldeux的答案可能比这更简洁,但另一种解决方案可能是单独查询然后将它们连接在一起。我认为这些方面的内容
from itertools import chain
import datetime
# get just todays data ordered by date modified
today_min = datetime.datetime.combine(datetime.date.today(), datetime.time.min)
today_max = datetime.datetime.combine(datetime.date.today(), datetime.time.max)
data_set1 = DataCollection.objects.filter(date_modified__range=(today_min, today_max)).order_by('-date_modified')
# get the rest of the data
data_set2 = DataCollection.objects.all().exclude(date_modified__range=(today_min, today_max)).order_by('-date_created')
# join it all together
all_list = list(chain(data_set1, data_set2))
我认为django计划引入一个__date
查询选择器,我不知道它是否可用,但这可能也有帮助