如何优化Django的paginator模块

时间:2011-01-04 22:37:19

标签: python django paginator

我对Django的paginator模块如何工作以及如何优化它有疑问。我从互联网上的不同API获得的信息中列出了大约300个项目。我正在使用Django的paginator模块来显示我的访问者列表,一次显示10个项目。分页不像我想要的那样有效。看起来分页器必须获取所有300个项目,然后再拔出每次页面更改时需要显示的10个项目。例如,如果有30个页面,那么转到第2页需要我的网站再次查询API,将所有信息放入列表中,然后访问访问者浏览器请求的10个。我不想继续查询API以获取与每页翻页相同的信息。

现在,我的视图有一个查看get请求的函数,并根据查询查询API以获取信息。然后它将所有信息放入列表并将其传递到模板文件中。因此,只要有人翻页,此函数就会一直加载,从而导致再次查询API。

我该如何解决这个问题?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

在这种情况下,分页器需要完整列表才能完成其工作。

我的建议是定期更新供稿缓存,然后使用该缓存作为paginator模块的输入。对每个请求执行密集或长度任务总是一个坏主意。如果不是用户将体验到的页面加载时间,请考虑服务器的攻击漏洞。

您可能需要查看Django's low level cache API,这样您就可以将Feed结果存储在密钥下的全局可访问位置,以后您可以使用该密钥检索每个页面请求的缓存和分页。

答案 1 :(得分:0)

在选择行之前,ORM不会加载数据:

query_results = Foo(id=1) # No sql executed yet, just stored.

foo = query_results[0] # now it fires

for foo in query_results:
   foo.bar() # sql fires

如果您使用的是在初始化时加载结果的自定义数据源,则分页将无法按预期工作,因为所有Feed都将立即获取。您可能希望将__getitem____iter__子类化以进行实际提取。然后它将与Django期望加载结果的方式一致。

分页需要知道有多少结果可以用来做像has_next()这样的事情。在sql中,获得带有索引的count(*)通常很便宜。所以你也想知道会有多少结果(或者只是估计它是否过于昂贵而无法确切知道)。