分页

未匹配的标注
本文档最新版为 4.0,旧版本可能放弃维护,推荐阅读最新版!

分页显示数据库记录

有几种分页项目的方法。最简单的方法是在 Query Builder 上使用 paglate方法或 ORM 查询。Orator 提供的 paginate 方法自动根据当前页面设置适当的限制和偏移量。默认情况下,需要指定当前页面。但是,正如我们稍后将看到的,您可以创建自定义的当前页面解析器。

分页查询生成器结果

首先,让我们看一下在查询构建器生成的查询上调用 paginate 方法:

users = db.table('users').paginate(15, 2)

在此示例中,传递给 paginate 的第一个参数是我们希望 「每页」显示的条目数,第二个参数是我们要显示的当前页面。所以,这里,我们要检索 2 页上的 15 条目。

当前,使用 group_by 语句的分页操作无法由 Orator 有效执行。如果您需要使用具有分页结果集的 group_by,建议您查询数据库并手动创建分页器。

分页模型

您也可以分页 ORM 查询。在此示例中,我们将在第二页的每页 15 个条目中对 User 模型进行分页。如您所见,语法几乎与分页查询构建器结果相同:

all_users = User.paginate(15, 2)

当然,您可以在查询上设置其他约束后调用 paginate:

some_users = User.where('votes', '>', 100).paginate(15, 2)

简单分页

如果分页中只需要「下一页」和「上一页」,您可以选择使用 Simple_Paglate 方法来执行更有效的查询。

some_users = User.where('votes', '>', 100).simple_paginate(15, 2)

手动创建分页器

有时您可能希望手动创建一个分页实例,并向其传递条目列表。您可以根据需要创建 PaginatorLengthAwarePaginator 实例来实现此目的。

Paginator 类不需要知道结果集中的条目总数;然而,由于这个原因,该类没有方法来检索最后一页的索引。LengthAwarePaginator 接受与 Paginator 几乎相同的参数,不同之处在于它确实需要对结果集中的条目总数进行计数。

换句话说,Paginator 对应于查询生成器和 ORM 上的 simple_paginate 方法,而LengthAwarePaginator 对应于 paginate 方法。

显示结果

当您在查询构建器或 ORM 查询上调用 paginatesimple_paginate 方法时,您将收到一个分页程序实例。调用 paginate 方法时,您将收到 LengthAwarePaginator 的实例。调用 simple_paginate 方法时,您将收到 Paginator 的实例。这些对象提供了几种描述结果集的方法和属性。除了这些辅助方法之外,分页程序实例是迭代器,并且可以作为列表循环。

for user in some_users:
    print(user.name)

其他属性和辅助方法

您还可以通过以下方法和属性在分页程序实例上访问其他分页信息:

METHOD OR ATTRIBUTE DESCRIPTION
results.count() 返回当前页面上的结果数
results.current_page 分页器的当前页
results.has_more_pages() 如果还有其他页面,则返回True,否则 False
results.last_page 最后一页的编号 (使用 simple_paginate时不可用)
results.next_page 下一页的编号 (如果存在),否则 None
results.per_page 每页结果数
results.previous_page 前一页的编号 (如果存在),否则 None
results.total 结果总数 (使用simple_paginate时不可用)

将结果转换为JSON

Oator分页器结果类公开了 to_json 方法,因此将分页结果转换为 JSON 非常容易。

默认情况下,它将返回 JSON 格式的基础 Collection

some_users = User.where('votes', '>', 100).paginate(15, 2)

print(some_users.to_json())

设置自定义当前页面解析器

有时,您可能希望基于外部参数来计算当前页面。为此,您可以在 Paginator 类上设置自定义当前页面解析器。在此示例中,当前页面将由 ?page 查询字符串参数确定:

from orator import Paginator
from flask import request

def current_page_resolver():
    return int(request.args.get('page', 1))

Paginator.current_page_resolver(current_page_resolver)

因此,从现在开始,不再需要指定当前页面:

some_users = User.where('votes', '>', 100).paginate(15)

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/masonite/2.3/or...

译文地址:https://learnku.com/docs/masonite/2.3/or...

上一篇 下一篇
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~