我有一个存储有用户帖子的数据库。现在我希望我的烧瓶应用程序每页显示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 =#参数。
如果有人知道绕过这个问题的方法,那就会膨胀;提前谢谢。
答案 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)