在django queryset doc(https://docs.djangoproject.com/en/1.10/ref/models/querysets/)中,它说"在内部,可以构造,过滤, 切片 ,并且通常会传递没有实际打到数据库。在您执行评估查询集的操作之前,实际上不会发生任何数据库活动。"然后,它说"您可以通过以下方式评估QuerySet:迭代/ 切片 /。 。 "
所以,我的问题是"在切片时是否评估Queryset"
答案 0 :(得分:2)
完整段落解释了切片何时评估查询集,何时不是(强调我的):
- 切片。如限制查询集中所述,可以使用Python的数组切片语法对QuerySet进行切片。切片未评估的QuerySet通常会返回另一个未评估的QuerySet,但如果使用切片语法的“step”参数,Django将执行数据库查询,并返回一个列表。切片已经过评估的QuerySet也会返回一个列表。
Django只会在您使用step参数时评估查询集,例如queryset[::2]
,因为这不能转换为SQL查询。在其他情况下,切片未评估的查询集将返回另一个未评估的查询集,Django将向查询添加LIMIT
和/或OFFSET
。