mirror of
https://github.com/django/django.git
synced 2025-08-03 18:38:50 +00:00
Fixed #26290 -- Warned that paginating an unordered QuerySet may result in inconsistent results.
This commit is contained in:
parent
724dd2043e
commit
c4980e28e5
5 changed files with 38 additions and 13 deletions
|
@ -5,6 +5,7 @@ from datetime import datetime
|
|||
|
||||
from django.core.paginator import (
|
||||
EmptyPage, InvalidPage, PageNotAnInteger, Paginator,
|
||||
UnorderedObjectListWarning,
|
||||
)
|
||||
from django.test import TestCase
|
||||
from django.utils import six
|
||||
|
@ -256,7 +257,7 @@ class ModelPaginationTests(TestCase):
|
|||
a.save()
|
||||
|
||||
def test_first_page(self):
|
||||
paginator = Paginator(Article.objects.all(), 5)
|
||||
paginator = Paginator(Article.objects.order_by('id'), 5)
|
||||
p = paginator.page(1)
|
||||
self.assertEqual("<Page 1 of 2>", six.text_type(p))
|
||||
self.assertQuerysetEqual(p.object_list, [
|
||||
|
@ -265,9 +266,7 @@ class ModelPaginationTests(TestCase):
|
|||
"<Article: Article 3>",
|
||||
"<Article: Article 4>",
|
||||
"<Article: Article 5>"
|
||||
],
|
||||
ordered=False
|
||||
)
|
||||
])
|
||||
self.assertTrue(p.has_next())
|
||||
self.assertFalse(p.has_previous())
|
||||
self.assertTrue(p.has_other_pages())
|
||||
|
@ -278,7 +277,7 @@ class ModelPaginationTests(TestCase):
|
|||
self.assertEqual(5, p.end_index())
|
||||
|
||||
def test_last_page(self):
|
||||
paginator = Paginator(Article.objects.all(), 5)
|
||||
paginator = Paginator(Article.objects.order_by('id'), 5)
|
||||
p = paginator.page(2)
|
||||
self.assertEqual("<Page 2 of 2>", six.text_type(p))
|
||||
self.assertQuerysetEqual(p.object_list, [
|
||||
|
@ -286,9 +285,7 @@ class ModelPaginationTests(TestCase):
|
|||
"<Article: Article 7>",
|
||||
"<Article: Article 8>",
|
||||
"<Article: Article 9>"
|
||||
],
|
||||
ordered=False
|
||||
)
|
||||
])
|
||||
self.assertFalse(p.has_next())
|
||||
self.assertTrue(p.has_previous())
|
||||
self.assertTrue(p.has_other_pages())
|
||||
|
@ -303,7 +300,7 @@ class ModelPaginationTests(TestCase):
|
|||
Tests proper behavior of a paginator page __getitem__ (queryset
|
||||
evaluation, slicing, exception raised).
|
||||
"""
|
||||
paginator = Paginator(Article.objects.all(), 5)
|
||||
paginator = Paginator(Article.objects.order_by('id'), 5)
|
||||
p = paginator.page(1)
|
||||
|
||||
# Make sure object_list queryset is not evaluated by an invalid __getitem__ call.
|
||||
|
@ -323,3 +320,14 @@ class ModelPaginationTests(TestCase):
|
|||
)
|
||||
# After __getitem__ is called, object_list is a list
|
||||
self.assertIsInstance(p.object_list, list)
|
||||
|
||||
def test_paginating_unordered_queryset_raises_warning(self):
|
||||
msg = (
|
||||
"Pagination may yield inconsistent results with an unordered "
|
||||
"object_list: <QuerySet [<Article: Article 1>, "
|
||||
"<Article: Article 2>, <Article: Article 3>, <Article: Article 4>, "
|
||||
"<Article: Article 5>, <Article: Article 6>, <Article: Article 7>, "
|
||||
"<Article: Article 8>, <Article: Article 9>]>"
|
||||
)
|
||||
with self.assertRaisesMessage(UnorderedObjectListWarning, msg):
|
||||
Paginator(Article.objects.all(), 5)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue