跳转到主要内容

为django提供的关键集分页(查找方法)。

项目描述

为Django提供的关键集分页。

Django分页使用LIMIT/OFFSET方法。这在较小的偏移量时效果不错,但一旦开始超过几页,性能可能会非常糟糕。这是因为数据库需要获取所有之前的行,即使它最终会丢弃它们。

使用关键集分页可以使“下一页”获取性能更佳,但代价是不能随机获取页面。也就是说,如果你知道前一页N-1的最后元素,那么你可以获取第N页,否则你实际上做不到。

关键集分页,有时也称为查找方法,由Markus WinandJoe Nelson进行了记录。如果你不熟悉这个概念,我强烈建议你阅读上述文章。

为了使用此包中的分页器,你可能还需要使用提供的视图混合:这改变了查询集分页的方式,以启用非整数的“页面号”。

class List(PaginationMixin, ListView):
    paginator_class = KeysetPaginator
    paginate_by = 10
    queryset = MyModel.objects.order_by('-timestamp', 'group')

你无法像在模板中迭代页面号那样迭代:你只能限制在下一页和上一页之间。否则,你将主要以相同的方式构建它们。

<a href="{% url 'mymodel:list' %}?page={{ page_obj.previous_page_number }}">
  Prev Page
</a>

<a href="{% url 'mymodel:list' %}?page={{ page_obj.next_page_number }}">
  Next Page
</a>

请注意,您无法访问查询集的长度或页数,因为这些查询可能很昂贵。您实际上并不需要知道这些 ;)

然而,我喜欢使用GET表单来 启用筛选结果的分页

<button form="target-form"
        name="page"
        value="{{ page_obj.previous_page_number }}"
        type="submit">
  &larr; Prev Page
</button>

<button form="target-form"
        name="page"
        value="{{ page_obj.next_page_number }}"
        type="submit">
  Next Page &rarr;
<button>

有关此包工作方式的更多详细信息,请参阅 https://schinckel.net/2018/11/23/keyset-pagination-in-django/

由支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面