我是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 %}
答案 0 :(得分:1)
QuerySet
对象的基础查询在您明确评估它们之前不会执行。每当您遍历它们时都会进行显式评估,包括调用str()
或unicode()
。
因此,上面的代码片段确实很有效。第tickets = Ticket.objects.filter(site=site.id)
行创建了一个新的QuerySet
,但尚未对该查询进行评估。
出于同样的原因,Model.objects.filter(foo).filter(bar).order_by(baz)...
之类的东西不会执行单个SQL查询。