7

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

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

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

4

3 回答 3

14

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

在你的情况下,丹尼尔已经给出了最好的解决方案:因为你只是想按相同的字段排序,但是以其他顺序,只需反转你拥有的列表:

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

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

qs = Foo.objects.all()[:5]
objs = sorted(qs, key=lambda o: o.some_other_field)
于 2009-06-02T12:00:20.053 回答
13

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

不过,听起来您已经知道解决方案:reversed()在评估的 qs 上运行。

qs = reversed(Foo.objects.all()[:5])
于 2009-06-02T11:48:09.283 回答
1

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

import random
sorted(queryset[:10], key=lambda x: random.random())
于 2012-06-03T22:02:04.557 回答