django - 切片后重新排序查询集

时间:2009-06-02 11:35:49

标签: django django-queryset django-orm

我从Foo模型中获取最新的5行,该模型按日期时间字段排序。

qs = Foo.objects.all()[:5]

在接下来的步骤中,我想通过其他一些条件(实际上,通过相反方向的相同日期时间字段)对查询集重新排序。但是不允许在切片后重新排序。 reverse()取消第一个排序,给我一个不同的查询集。有没有办法实现我想要的,而无需从查询集创建列表并使用它进行排序?

3 个答案:

答案 0 :(得分:14)

order_by为您提供SQL数据库内订购。你已经在使用它,然后切片。此时,结果将被检索到内存中。如果要更改其顺序,则需要使用Python内存中排序来执行此操作,而不是使用ORM数据库内排序。

在您的情况下,Daniel已经提供了最佳解决方案:因为您只想按相同的字段排序,但在其他顺序中,只需反转您的列表:

qs = Foo.objects.all()[:5]
objs = reversed(qs)

如果您想要按其他字段排序,那么您将使用sorted()函数和自定义键函数:

qs = Foo.objects.all()[:5]
objs = sorted(qs, key=lambda o: o.some_other_field)

答案 1 :(得分:12)

不,没有办法做到这一点。 order_by是对数据库的操作,但是当您对查询集进行切片时,它会被评估,并且在此之后不会返回到数据库。

听起来你已经知道了解决方案:在评估的qs上运行reversed()

qs = reversed(Foo.objects.all()[:5])

答案 2 :(得分:1)

迟到的答案,但这对我有用:

import random
sorted(queryset[:10], key=lambda x: random.random())