Django切片分页

1 投票
1 回答
1150 浏览
提问于 2025-04-16 07:48

我刚接触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查询。

撰写回答