在烧瓶中分页子查询

时间:2019-10-08 15:04:07

标签: python flask sqlalchemy pagination

这是在Strange paginate behaviour when paginating a subquery in flask中发布的问题的缩写。

我需要对以下查询的结果进行分页并显示结果:

sub = db.session.query(Magazine).join(Magazine.subscribers).filter(User.id == 2).subquery()
subscribers = db.session.query(User).select_from(sub).join(Magazine.subscribers)

,我尝试使用以下代码进行操作:

page=request.args.get('page', 1, type=int)
friends=subscribers.paginate(page, 3, False)
next_url=url_for('index', page=friends.next_num) if friends.has_next else None
prev_url=url_for('index', page=friends.prev_num) if friends.has_prev else None
return render_template("index.html", title="My friends", friends=friends.items, next_url=next_url, prev_url=prev_url)

这给出了一个奇怪的结果。首先,当要求3且friends.has_next为true时,它仅返回2个结果。当它为true时(数据库中有更多项)。在Strange paginate behaviour when paginating a subquery in flask中,有更多详细信息以及我运行的测试。我怀疑错误来自子查询。我是否缺少明显的东西?

在下面的示例中,我在烧瓶外壳中处理了一些“伪”数据:

>>> sub = db.session.query(Magazine).join(Magazine.subscribers).filter(User.id == 2).subquery()
>>> subscribers = db.session.query(User).select_from(sub).join(Magazine.subscribers)
>>> friends=subscribers.paginate(1, 3, False)
>>> subscribers.all()
[<User 2>, <User 3>, <User 4>, <User 5>, <User 6>]
>>> friends.items
[<User 2>, <User 3>]
>>> friends.has_next
False
>>> friends.has_prev
False

有什么见解吗?

1 个答案:

答案 0 :(得分:0)

您可以使用sqlalchemy_paginator。请查看此link,以获取详细示例。

from sqlalchemy_paginator import Paginator
query = session.query(MyModel)
paginator = Paginator(query, 5)
for page in paginator:
    print "page number of current page in iterator", page.number
    print "this is a list that contains the records of current page", page.object_list