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

sha*_*nyu 7 django django-orm django-queryset

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

qs = Foo.objects.all()[:5]
Run Code Online (Sandbox Code Playgroud)

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

Ned*_*der 14

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

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

qs = Foo.objects.all()[:5]
objs = reversed(qs)
Run Code Online (Sandbox Code Playgroud)

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

qs = Foo.objects.all()[:5]
objs = sorted(qs, key=lambda o: o.some_other_field)
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 13

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

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

qs = reversed(Foo.objects.all()[:5])
Run Code Online (Sandbox Code Playgroud)