我尝试对分页结果运行查询,就像这样
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
答案 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按钮。