django的键集分页(seek方法)。
django-keyset-pagination-plus的Python项目详细描述
django的键集分页。
django分页使用limit/offset方法。对于较小的偏移来说,这是很好的,但是一旦你开始超过几页,它就会表现得非常糟糕。这是因为数据库需要获取前面的所有行,即使它丢弃了它们。
使用键集分页可以更好地执行“下一页”提取,但代价是无法随机提取页。也就是说,如果您知道第n-1页中的最后一个元素,那么您可以获取第n页,但如果不知道,您确实无法获取。
键集分页(有时称为seek方法)已由Markus Winand和Joe Nelson记录。如果你不熟悉这个概念,我强烈建议你阅读以上文章。
为了在这个包中使用PypInter,您可能还需要使用提供的视图MIXIN:这改变了QueReSub被分页的方式来启用非整数的“页码”。
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>
请注意,您无法访问queryset的长度和页数,因为这些查询可能很昂贵。你真的不需要知道;)
但是,我喜欢使用get forms来enable pagination of filtered results:
<button form="target-form"
name="page"
value="{{ page_obj.previous_page_number }}"
type="submit">
← Prev Page
</button>
<button form="target-form"
name="page"
value="{{ page_obj.next_page_number }}"
type="submit">
Next Page →
<button>
请参阅https://schinckel.net/2018/11/23/keyset-pagination-in-django/以了解有关此包如何工作的更多详细信息。