Django对大图像缩略图的分页

时间:2011-05-09 01:33:40

标签: django pagination

我有几百张图像缩略图,每张15k。我想在每个页面上显示20个左右。

django.core.paginator是否足以满足这些页面的分页效果?即,它只会返回当前页面上显示的那些图像吗? (如果没有,那么这样做的好方法是什么?)谢谢。

1 个答案:

答案 0 :(得分:1)

取决于,因为RDBMS有一个很大的限制(它会影响所有数据库,包括MySQL,Postgres等)。

django.core.paginator使用QuerySet表示任何类型的SQL查询,并添加LIMIT子句以从数据库中获取几个条目。这种方法适用于多种应用程序,但如果您有大量条目,可能会成为一个严重的问题。特别的问题是,无论何时访问第800页,数据库实际上都会获取801 * 20个条目,然后再次删除前800 * 20个条目以返回最后20个条目。

不幸的是,没有简单的方法来解决这个问题。在很多情况下,next / prev按钮可能就足够了,所以你可以编写自己的分页,它可以在后键而不是页码上操作。例如,如果用户当前显示的最后一个条目具有键"D",则会显示链接到/next?after=D的下一个按钮,然后使用SELECT * FROM objects WHERE key > D {{1}之类的SQL查询}。这种方法的优点是,您可以在ORDER BY key LIMIT 20上添加索引,从而显着加快速度。

另一种方法要求您在表中添加一个附加的索引(!)列objects.key。然后,您可以执行page_num之类的SQL查询。使用这种方法,您仍然可以随机访问所有页面,但您必须维护page_num列。如果数据大部分都附加在最后,这可能很容易,如果你想有效地从中间删除/插入元素,这可能会更复杂。

所以,我会从SELECT * FROM objects WHERE page_num=800 ORDER BY key开始,因为它只是一行代码。但要注意分页视图的响应时间和数据库中的慢查询日志。如果您的数据库服务器无法再处理负载,则必须选择上述技术之一。如果需要随机页面访问,则选择解决方案2,否则选择解决方案1(因为它更简单)。

PS:是的,django.core.paginator可以正常使用。 :)