summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomer Chachamu <tomer@festicket.com>2017-10-18 14:09:45 +0100
committerTim Graham <timograham@gmail.com>2017-10-21 21:03:52 -0400
commite98ae4fe6bc1baa402b10bc379d2e96b79bbb3b0 (patch)
treeba70d4778ea58858051841162ac37e74197cda5c
parentb0566e5bb3216b8ca6e9c8473ed550d5d8825f56 (diff)
[1.11.x] Fixed #28722 -- Made QuerySet.reverse() affect nulls_first/nulls_last.
Backport of 21a3a29dc9d138c248fd7922923b3ec710735c6c from master
-rw-r--r--AUTHORS1
-rw-r--r--django/db/models/expressions.py3
-rw-r--r--docs/releases/1.11.7.txt3
-rw-r--r--tests/ordering/tests.py36
4 files changed, 27 insertions, 16 deletions
diff --git a/AUTHORS b/AUTHORS
index c2a55095f2..9d27cd039b 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -765,6 +765,7 @@ answer newbie questions, and generally made Django that much better:
Tome Cvitan <tome@cvitan.com>
Tomek Paczkowski <tomek@hauru.eu>
Tom Insam
+ Tomer Chachamu
Tommy Beadle <tbeadle@gmail.com>
Tom Tobin
Tore Lundqvist <tore.lundqvist@gmail.com>
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py
index e8bd921083..adafd26e89 100644
--- a/django/db/models/expressions.py
+++ b/django/db/models/expressions.py
@@ -1089,6 +1089,9 @@ class OrderBy(BaseExpression):
def reverse_ordering(self):
self.descending = not self.descending
+ if self.nulls_first or self.nulls_last:
+ self.nulls_first = not self.nulls_first
+ self.nulls_last = not self.nulls_last
return self
def asc(self):
diff --git a/docs/releases/1.11.7.txt b/docs/releases/1.11.7.txt
index 717174c625..fe2cf2e300 100644
--- a/docs/releases/1.11.7.txt
+++ b/docs/releases/1.11.7.txt
@@ -13,3 +13,6 @@ Bugfixes
argument is a callable that returns ``None`` (:ticket:`28601`).
* Fixed the Basque ``DATE_FORMAT`` string (:ticket:`28710`).
+
+* Made ``QuerySet.reverse()`` affect ``nulls_first`` and ``nulls_last``
+ (:ticket:`28722`).
diff --git a/tests/ordering/tests.py b/tests/ordering/tests.py
index 399b8d7035..62ce558a93 100644
--- a/tests/ordering/tests.py
+++ b/tests/ordering/tests.py
@@ -94,24 +94,28 @@ class OrderingTests(TestCase):
with self.assertRaisesMessage(ValueError, msg):
Article.objects.order_by(F("author").desc(nulls_last=True, nulls_first=True))
+ def assertQuerysetEqualReversible(self, queryset, sequence):
+ self.assertSequenceEqual(queryset, sequence)
+ self.assertSequenceEqual(queryset.reverse(), list(reversed(sequence)))
+
def test_order_by_nulls_last(self):
Article.objects.filter(headline="Article 3").update(author=self.author_1)
Article.objects.filter(headline="Article 4").update(author=self.author_2)
# asc and desc are chainable with nulls_last.
- self.assertSequenceEqual(
- Article.objects.order_by(F("author").desc(nulls_last=True)),
+ self.assertQuerysetEqualReversible(
+ Article.objects.order_by(F("author").desc(nulls_last=True), 'headline'),
[self.a4, self.a3, self.a1, self.a2],
)
- self.assertSequenceEqual(
- Article.objects.order_by(F("author").asc(nulls_last=True)),
+ self.assertQuerysetEqualReversible(
+ Article.objects.order_by(F("author").asc(nulls_last=True), 'headline'),
[self.a3, self.a4, self.a1, self.a2],
)
- self.assertSequenceEqual(
- Article.objects.order_by(Upper("author__name").desc(nulls_last=True)),
+ self.assertQuerysetEqualReversible(
+ Article.objects.order_by(Upper("author__name").desc(nulls_last=True), 'headline'),
[self.a4, self.a3, self.a1, self.a2],
)
- self.assertSequenceEqual(
- Article.objects.order_by(Upper("author__name").asc(nulls_last=True)),
+ self.assertQuerysetEqualReversible(
+ Article.objects.order_by(Upper("author__name").asc(nulls_last=True), 'headline'),
[self.a3, self.a4, self.a1, self.a2],
)
@@ -119,20 +123,20 @@ class OrderingTests(TestCase):
Article.objects.filter(headline="Article 3").update(author=self.author_1)
Article.objects.filter(headline="Article 4").update(author=self.author_2)
# asc and desc are chainable with nulls_first.
- self.assertSequenceEqual(
- Article.objects.order_by(F("author").asc(nulls_first=True)),
+ self.assertQuerysetEqualReversible(
+ Article.objects.order_by(F("author").asc(nulls_first=True), 'headline'),
[self.a1, self.a2, self.a3, self.a4],
)
- self.assertSequenceEqual(
- Article.objects.order_by(F("author").desc(nulls_first=True)),
+ self.assertQuerysetEqualReversible(
+ Article.objects.order_by(F("author").desc(nulls_first=True), 'headline'),
[self.a1, self.a2, self.a4, self.a3],
)
- self.assertSequenceEqual(
- Article.objects.order_by(Upper("author__name").asc(nulls_first=True)),
+ self.assertQuerysetEqualReversible(
+ Article.objects.order_by(Upper("author__name").asc(nulls_first=True), 'headline'),
[self.a1, self.a2, self.a3, self.a4],
)
- self.assertSequenceEqual(
- Article.objects.order_by(Upper("author__name").desc(nulls_first=True)),
+ self.assertQuerysetEqualReversible(
+ Article.objects.order_by(Upper("author__name").desc(nulls_first=True), 'headline'),
[self.a1, self.a2, self.a4, self.a3],
)