关于Django模型查询集的切片

时间:2016-07-28 11:04:39

标签: django django-models django-queryset

我尝试对分页结果运行查询,就像这样 Model.objects.all()[start: start+page_size]

我还想知道是否有更多页面要加载,也就是说,我想知道start+page_size < Model.objects.all().count().是否

我的问题是,如果我在这里两次调用all(),Django是否执行两次相同的查询(一个用于切片操作[],一个用于count())。

另一个问题是,如果我在Model.objects.all()这样的Model.objects.all()[2:9]切片是否Django从DB获取所有数据并通过python切片,或者Django只获取SQL限制limit 2 to 9

1 个答案:

答案 0 :(得分:8)

是的,它会产生两个查询,但这些查询根本不是“相同的查询”。一个是SELECT * FROM mymodel LIMIT <page_size> OFFSET <start>,另一个是SELECT COUNT(*) FROM mymodel

如果你想避免两个查询,一个简单的解决方法就是要求多一条记录而不是你真正需要的:

Model.objects.all()[start: start+page_size+1]

然后你可以迭代到page_size,如果那里有额外的记录,则显示Next按钮。