python - 使用SQLAlchemy为页面

时间:2018-02-12 22:40:24

标签: python python-3.x flask sqlalchemy flask-sqlalchemy

我有一个存储有用户帖子的数据库。现在我希望我的烧瓶应用程序每页显示n个帖子,但问题是,帖子可能会在某个时候被删除。 我的基本查询是:

start = (page-1) * n 
postlist = Posts.query.filter(Posts.id > start).limit(n).all()

这将从start开始返回n个帖子。这很有效,除了如果有删除的帖子,获取1以外的页面的启动不能正常工作。 假设帖子5和7被删除,第1页将显示帖子1-12,第2页将显示帖子11-20等等,这意味着一些帖子将显示在多个页面上。对于大型数据库来说,这个问题会很难滚雪球。

所以,我想到了两种缓解这个问题的方法,尽管我并不喜欢这两种方法。

a)我们不是收到n个帖子,而是从开始到开始+ n:

start = (page-1) * n
end = start + n
postlist = Posts.query.filter(Posts.id > start).filter(Posts.id <= (start+n)).all()

这有效,但我显然每页都没有得到n个结果。最糟糕的情况是,会有完全为空的页面。其中几个。相继。所以,另一种选择是b):

postlist = Posts.query.filter(Posts.id > start).limit(n).all()
end = postlist[-1].id

然后使用end作为下一页的开头。但是:我必须通过GET(看起来很难看)提供新的值,并且通过其通用URL(/ posts / page /#)访问特定页面会产生与使用上一个/下一个链接不同的结果。将通过url提供?start =#参数。

如果有人知道绕过这个问题的方法,那就会膨胀;提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用以下方法获得结果

使用偏移量和限制,使用页面和计数变量

Return FuncName($f) = "A" ? $f() : FuncName($f) = "B" ? $f($a,$b,$c) : $f($a,$b,$c,$d)

另一种使用 sqlalchemy Paginator

的方法
page = kwargs.pop('page', None)
count = kwargs.pop('count', None)
page = page * count
postlist = Posts.query.filter(Posts.id.desc()).offset(page).limit(count).all()

获得分页对象后,您可以根据页码

访问以下参数
from sqlalchemy_paginator import Paginator
page_size = 20
postlist_obj = Posts.query.filter(Posts.id.desc())
pagination = Paginator(postlist_obj,page_size)