2016-07-28 89 views
0

我尝试运行查询寻呼结果,如 Model.objects.all()[start: start+page_size]Django模型查询集切片

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

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

另一个问题是,如果我在Model.objects.all()片这样Model.objects.all()[2:9]的Django是否由蟒蛇获取从数据库中的所有数据和切片,或者Django的只有SQL限取limit 2 to 9

+0

btw,在Django中分页的正确方法是https://docs.djangoproject.com/en/1.9/topics/pagination/ – Compadre

回答

3

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

如果你想避免两个查询,一个简单的解决方法是,要求多一个记录比实际需要:

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

,那么你可以遍历高达PAGE_SIZE,并显示下一个按钮,如果额外记录在那里。

+0

谢谢Daniel。它真的是一个聪明的把戏! –

+0

如果'result = Model.objects.all()[a:a + 101]',然后对结果'sliced = result [a:a + 100]'进行切片或者使用len()'len(result)',将Django提出两个疑问? –

+0

https://docs.djangoproject.com/en/1.9/ref/models/querysets/#when-querysets-are-evaluated – Compadre