【发布时间】:2015-06-04 06:59:12
【问题描述】:
限制从 Django 查询集返回的结果集的方法是通过数组切片完成的。例如,要获得前 5 人:
People.objects.all()[0:5]
或者,按名称排序:
People.objects.order_by(name)[0:5]
或按姓名排序,但仅限 65 岁以上的人:
People.objects.order_by(name).filter(age__gt=65)[0:5]
事实上,我能想到的 only 活动在 没有 具有功能的查询集上是有限的。
我想知道的是,是否有一种方法(内部的、记录的或其他的)可以在 QuerySet 上调用,作为限制或切片?
如果没有,最好的方法是什么?
注意事项:
- 是的,这可能是个坏主意,不,我不太热衷于实施它,但如果有一个 好的 理由让它这样做,可能吗?
- 是的,我知道切片是延迟执行的,这不是我要问的。
-
This is not a duplicate of this question,正如公认的答案所说:
results[:max_count]在视图中,在.order_by()之后。
【问题讨论】:
-
你想通过不使用切片来完成或避免什么?
-
没什么。我正在查看一个 django 库的一些代码,它只能返回一个列表,而不是一个查询集,并且切片它存在一个问题,因为切片的惰性方面不相关,因为它首先将整个查询集转换为一个列表.
-
根据documentation,切片是唯一的方法。
-
在我看来,您必须将任何此类调用线程化到第三方库中 - 问题不在于语法,而在于在您想要它之前评估 qs。
-
@thefourtheye 因为切片是懒惰的,它实际上是在最后一刻才完成的。我在cmets之后挖了代码,看来你可以很容易地调用内部限制方法。