Django模型查询集上的切片

7

我尝试运行一个分页结果的查询,像这样: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是从数据库中获取所有数据并由Python进行切片,还是只使用SQL限制limit 2 to 9来获取数据。


顺便提一下,在Django中正确的分页方式在这里:https://docs.djangoproject.com/en/1.9/topics/pagination/ - Compadre
Django中用于分页的工作链接:https://docs.djangoproject.com/en/dev/topics/pagination/ - PaulR
1个回答

12

是的,它会执行两个查询,但这些查询并不完全相同。其中一个是SELECT * FROM mymodel LIMIT <page_size> OFFSET <start>,另一个是SELECT COUNT(*) FROM mymodel

如果你想避免两次查询,一个简单的解决方法是请求多获取一条记录:

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

那么您可以迭代至 page_size,并且如果有额外的记录,则显示“下一页”按钮。


如果 result = Model.objects.all()[a: a+101],然后在结果上进行切片 sliced = result[a: a+100] 或使用 len() len(result),Django 会执行两个查询吗? - Yanye Li
https://docs.djangoproject.com/en/1.9/ref/models/querysets/#when-querysets-are-evaluated - Compadre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接