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)