在Django模型Queryset上切片

Yan*_* Li 2 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

Dan*_*man 8

是的,它会进行两次查询,但这些查询根本不是"相同的查询".一个是SELECT * FROM mymodel LIMIT <page_size> OFFSET <start>另一个是SELECT COUNT(*) FROM mymodel.

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

Model.objects.all()[start: start+page_size+1]
Run Code Online (Sandbox Code Playgroud)

那么你可以迭代到page_size,如果有额外的记录,则显示Next按钮.