mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #28722 -- Made QuerySet.reverse() affect nulls_first/nulls_last.
This commit is contained in:
		
				
					committed by
					
						 Tim Graham
						Tim Graham
					
				
			
			
				
	
			
			
			
						parent
						
							6c3104221b
						
					
				
				
					commit
					21a3a29dc9
				
			
							
								
								
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							| @@ -792,6 +792,7 @@ answer newbie questions, and generally made Django that much better: | |||||||
|     Tomáš Kopeček <permonik@m6.cz> |     Tomáš Kopeček <permonik@m6.cz> | ||||||
|     Tome Cvitan <tome@cvitan.com> |     Tome Cvitan <tome@cvitan.com> | ||||||
|     Tomek Paczkowski <tomek@hauru.eu> |     Tomek Paczkowski <tomek@hauru.eu> | ||||||
|  |     Tomer Chachamu | ||||||
|     Tommy Beadle <tbeadle@gmail.com> |     Tommy Beadle <tbeadle@gmail.com> | ||||||
|     Tore Lundqvist <tore.lundqvist@gmail.com> |     Tore Lundqvist <tore.lundqvist@gmail.com> | ||||||
|     torne-django@wolfpuppy.org.uk |     torne-django@wolfpuppy.org.uk | ||||||
|   | |||||||
| @@ -1132,6 +1132,9 @@ class OrderBy(BaseExpression): | |||||||
|  |  | ||||||
|     def reverse_ordering(self): |     def reverse_ordering(self): | ||||||
|         self.descending = not self.descending |         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 |         return self | ||||||
|  |  | ||||||
|     def asc(self): |     def asc(self): | ||||||
|   | |||||||
| @@ -13,3 +13,6 @@ Bugfixes | |||||||
|   argument is a callable that returns ``None`` (:ticket:`28601`). |   argument is a callable that returns ``None`` (:ticket:`28601`). | ||||||
|  |  | ||||||
| * Fixed the Basque ``DATE_FORMAT`` string (:ticket:`28710`). | * Fixed the Basque ``DATE_FORMAT`` string (:ticket:`28710`). | ||||||
|  |  | ||||||
|  | * Made ``QuerySet.reverse()`` affect ``nulls_first`` and ``nulls_last`` | ||||||
|  |   (:ticket:`28722`). | ||||||
|   | |||||||
| @@ -92,24 +92,28 @@ class OrderingTests(TestCase): | |||||||
|         with self.assertRaisesMessage(ValueError, msg): |         with self.assertRaisesMessage(ValueError, msg): | ||||||
|             Article.objects.order_by(F("author").desc(nulls_last=True, nulls_first=True)) |             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): |     def test_order_by_nulls_last(self): | ||||||
|         Article.objects.filter(headline="Article 3").update(author=self.author_1) |         Article.objects.filter(headline="Article 3").update(author=self.author_1) | ||||||
|         Article.objects.filter(headline="Article 4").update(author=self.author_2) |         Article.objects.filter(headline="Article 4").update(author=self.author_2) | ||||||
|         # asc and desc are chainable with nulls_last. |         # asc and desc are chainable with nulls_last. | ||||||
|         self.assertSequenceEqual( |         self.assertQuerysetEqualReversible( | ||||||
|             Article.objects.order_by(F("author").desc(nulls_last=True)), |             Article.objects.order_by(F("author").desc(nulls_last=True), 'headline'), | ||||||
|             [self.a4, self.a3, self.a1, self.a2], |             [self.a4, self.a3, self.a1, self.a2], | ||||||
|         ) |         ) | ||||||
|         self.assertSequenceEqual( |         self.assertQuerysetEqualReversible( | ||||||
|             Article.objects.order_by(F("author").asc(nulls_last=True)), |             Article.objects.order_by(F("author").asc(nulls_last=True), 'headline'), | ||||||
|             [self.a3, self.a4, self.a1, self.a2], |             [self.a3, self.a4, self.a1, self.a2], | ||||||
|         ) |         ) | ||||||
|         self.assertSequenceEqual( |         self.assertQuerysetEqualReversible( | ||||||
|             Article.objects.order_by(Upper("author__name").desc(nulls_last=True)), |             Article.objects.order_by(Upper("author__name").desc(nulls_last=True), 'headline'), | ||||||
|             [self.a4, self.a3, self.a1, self.a2], |             [self.a4, self.a3, self.a1, self.a2], | ||||||
|         ) |         ) | ||||||
|         self.assertSequenceEqual( |         self.assertQuerysetEqualReversible( | ||||||
|             Article.objects.order_by(Upper("author__name").asc(nulls_last=True)), |             Article.objects.order_by(Upper("author__name").asc(nulls_last=True), 'headline'), | ||||||
|             [self.a3, self.a4, self.a1, self.a2], |             [self.a3, self.a4, self.a1, self.a2], | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
| @@ -117,20 +121,20 @@ class OrderingTests(TestCase): | |||||||
|         Article.objects.filter(headline="Article 3").update(author=self.author_1) |         Article.objects.filter(headline="Article 3").update(author=self.author_1) | ||||||
|         Article.objects.filter(headline="Article 4").update(author=self.author_2) |         Article.objects.filter(headline="Article 4").update(author=self.author_2) | ||||||
|         # asc and desc are chainable with nulls_first. |         # asc and desc are chainable with nulls_first. | ||||||
|         self.assertSequenceEqual( |         self.assertQuerysetEqualReversible( | ||||||
|             Article.objects.order_by(F("author").asc(nulls_first=True)), |             Article.objects.order_by(F("author").asc(nulls_first=True), 'headline'), | ||||||
|             [self.a1, self.a2, self.a3, self.a4], |             [self.a1, self.a2, self.a3, self.a4], | ||||||
|         ) |         ) | ||||||
|         self.assertSequenceEqual( |         self.assertQuerysetEqualReversible( | ||||||
|             Article.objects.order_by(F("author").desc(nulls_first=True)), |             Article.objects.order_by(F("author").desc(nulls_first=True), 'headline'), | ||||||
|             [self.a1, self.a2, self.a4, self.a3], |             [self.a1, self.a2, self.a4, self.a3], | ||||||
|         ) |         ) | ||||||
|         self.assertSequenceEqual( |         self.assertQuerysetEqualReversible( | ||||||
|             Article.objects.order_by(Upper("author__name").asc(nulls_first=True)), |             Article.objects.order_by(Upper("author__name").asc(nulls_first=True), 'headline'), | ||||||
|             [self.a1, self.a2, self.a3, self.a4], |             [self.a1, self.a2, self.a3, self.a4], | ||||||
|         ) |         ) | ||||||
|         self.assertSequenceEqual( |         self.assertQuerysetEqualReversible( | ||||||
|             Article.objects.order_by(Upper("author__name").desc(nulls_first=True)), |             Article.objects.order_by(Upper("author__name").desc(nulls_first=True), 'headline'), | ||||||
|             [self.a1, self.a2, self.a4, self.a3], |             [self.a1, self.a2, self.a4, self.a3], | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user