Django - 按日期而不是日期时间排序查询集

时间:2016-08-22 18:05:26

标签: python django sorting

我有一个模型(代表'工作'),其中包含名为 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很快,但这让我的胃口有点不稳定。

3 个答案:

答案 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查询选择器,我不知道它是否可用,但这可能也有帮助