Skip to content

Commit 67e6388

Browse files
authored
Merge pull request #485 from idoshr/pagigation
Improved: Pagination performance
2 parents c1a4edd + 19a381b commit 67e6388

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

flask_mongoengine/pagination.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,20 @@ def __init__(self, iterable, page, per_page):
1616
self.iterable = iterable
1717
self.page = page
1818
self.per_page = per_page
19-
self.total = len(iterable)
2019

21-
start_index = (page - 1) * per_page
22-
end_index = page * per_page
23-
24-
self.items = iterable[start_index:end_index]
25-
if isinstance(self.items, QuerySet):
26-
self.items = self.items.select_related()
20+
if isinstance(self.iterable, QuerySet):
21+
self.total = iterable.count()
22+
self.items = (
23+
self.iterable.skip(self.per_page * (self.page - 1))
24+
.limit(self.per_page)
25+
.select_related()
26+
)
27+
else:
28+
start_index = (page - 1) * per_page
29+
end_index = page * per_page
30+
31+
self.total = len(iterable)
32+
self.items = iterable[start_index:end_index]
2733
if not self.items and page != 1:
2834
abort(404)
2935

tests/test_pagination.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ def test_queryset_paginator(app, todo):
1818
paginator = Pagination(Todo.objects, 1, 10)
1919
_test_paginator(paginator)
2020

21+
for page in range(1, 10):
22+
for index, todo in enumerate(
23+
Todo.objects.paginate(page=page, per_page=5).items
24+
):
25+
assert todo.title == f"post: {(page-1) * 5 + index}"
26+
2127

2228
def test_paginate_plain_list():
2329
with pytest.raises(NotFound):

0 commit comments

Comments
 (0)