Django分页切片

时间:2010-11-30 03:44:29

标签: python django django-templates

我是Django和Python的新手,我试图了解如何在不首先从QuerySet获取所有记录的情况下完成分页。我在QuerySets中看到的所有示例都将首先获得所有记录,如下所示。

tickets = Ticket.objects.filter(site=site.id)    
paginator = Paginator(tickets, settings.PAGE_SIZE)

这似乎有意义,以便Paginator可以参考它需要多少页面。但是,获取每个页面请求的所有记录似乎效率低下。我知道可以对QuerySets进行切片以返回一系列记录。

如何设计我的分页以便只获取与该页面相关的记录(切片?),但仍然具有分页功能?

修改:添加了迭代的模板代码。

  {% for ticket in tickets.object_list %}
        {{ ticket }}<br/>
   {% endfor %}

1 个答案:

答案 0 :(得分:1)

QuerySet对象的基础查询在您明确评估它们之前不会执行。每当您遍历它们时都会进行显式评估,包括调用str()unicode()

因此,上面的代码片段确实很有效。第tickets = Ticket.objects.filter(site=site.id)行创建了一个新的QuerySet,但尚未对该查询进行评估。

出于同样的原因,Model.objects.filter(foo).filter(bar).order_by(baz)...之类的东西不会执行单个SQL查询。