Django切片分页
我刚接触Django和Python,想弄明白怎么实现分页,而不是先把所有记录都从查询集中取出来。我看到的所有关于查询集的例子,都是先把所有记录都取出来,像下面这样。
tickets = Ticket.objects.filter(site=site.id)
paginator = Paginator(tickets, settings.PAGE_SIZE)
这样做似乎是合理的,因为分页器需要知道总共有多少页。但是,这样每次请求页面时都取出所有记录,感觉效率不高。我知道查询集可以切片,这样可以返回一部分记录。
我该怎么设计我的分页,才能只获取当前页面需要的记录(切片?),同时又能保留分页的功能呢?
编辑:添加了一个迭代的模板代码。
{% for ticket in tickets.object_list %}
{{ ticket }}<br/>
{% endfor %}
1 个回答
1
对于QuerySet
对象,底层的查询在你明确要求的时候才会被执行。明确要求的意思是,当你开始遍历这些对象的时候,比如调用str()
或者unicode()
的时候。
所以,上面的代码片段确实是高效的。那行代码tickets = Ticket.objects.filter(site=site.id)
创建了一个新的QuerySet
,但是这个查询还没有被执行。
同样的原因,像Model.objects.filter(foo).filter(bar).order_by(baz)...
这样的操作也不会执行任何SQL查询。