使用Pony ORM实现分页功能

3

有没有关于使用Pony ORM进行分页的最佳实践?

我发现其他人使用has_nexthas_previous帮助方法,但在Pony中我必须自己实现。

到目前为止,这是我拥有的东西,一些Jinja helpers:

# Jinja helpers for pagination
def next_page(current, max_page):
    if current >= max_page:
        return False
    else:
        return current + 1


def prev_page(current, max_page):
    if current < 2:
        return False
    else:
        return current - 1 

max_page是这样计算的:math.ceil(MyTable.select().count()/PAGE_SIZE)

但这里需要不断传递当前页和最大页码,有点繁琐。

{% if maxpage > 1 %}
    {% if prev_page(page, maxpage) %}
    <a href="{{ url_for('index', pagenum=prev_page(page, maxpage)) }}"><</a>
    {% endif %}

    {% if next_page(page, maxpage) %}
    <a href="{{ url_for('index', pagenum=next_page(page, maxpage)) }}">></a>
    {% endif %}
{% endif %}

那我有什么遗漏吗?有更好的方法吗?
2个回答

2

快速解决方案,可能不是最好的

@app.route('/persons-list/<int:page>') 
def persons_list(page):
    LIMIT = 10
    items = select(p for p in models.Person)
    return render_template('persons_list.html',
                            maxpage=items.count()//LIMIT,
                            page=page,
                            items=items.page(page, LIMIT))

在模板中:

{% if maxpage > 1 %}
    {% if page - 1 >= 1 %}
        <a href="{{ url_for('persons_list', page=page-1) }}"><</a>
    {% endif %}

    Page {{ page }} of {{ maxpage }}

    {% if page + 1 <= maxpage %}
        <a href="{{ url_for('persons_list', page=page+1) }}">></a>
    {% endif %}
{% endif %}

2
您可以查询分页。
q = models.select(d for d in models.Thingy)
page = 1
count = q.count()
results_of_first_page = q.page(page, 20)
pages = int(count/20)
if pages > 20:
    pages = 20

我在官方文档中看到,他们希望在执行.page()之前对查询进行排序:Product.select().order_by(lambda p: desc(p.price)).page(1)您知道是否可以跳过.sort(),就像您的示例一样?我想知道顺序是否会是随机的,然后页面会有重复的对象吗? - Michael Boesl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接