分页
分页显示数据库记录
有几种分页项目的方法。最简单的方法是在 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)
手动创建分页器
有时您可能希望手动创建一个分页实例,并向其传递条目列表。您可以根据需要创建 Paginator
或 LengthAwarePaginator
实例来实现此目的。
Paginator
类不需要知道结果集中的条目总数;然而,由于这个原因,该类没有方法来检索最后一页的索引。LengthAwarePaginator
接受与 Paginator
几乎相同的参数,不同之处在于它确实需要对结果集中的条目总数进行计数。
换句话说,Paginator
对应于查询生成器和 ORM 上的 simple_paginate
方法,而LengthAwarePaginator
对应于 paginate
方法。
显示结果
当您在查询构建器或 ORM 查询上调用 paginate
或 simple_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)
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。