我从Foo模型中获取最新的5行,该模型按日期时间字段排序。
qs = Foo.objects.all()[:5]
在接下来的步骤中,我想通过其他一些条件(实际上,通过相反方向的相同日期时间字段)对查询集重新排序。但是不允许在切片后重新排序。 reverse()取消第一个排序,给我一个不同的查询集。有没有办法实现我想要的,而无需从查询集创建列表并使用它进行排序?
答案 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())