我有几百张图像缩略图,每张15k。我想在每个页面上显示20个左右。
django.core.paginator
是否足以满足这些页面的分页效果?即,它只会返回当前页面上显示的那些图像吗? (如果没有,那么这样做的好方法是什么?)谢谢。
答案 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
可以正常使用。 :)