mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	Fixed #33705 -- Fixed crash when using IsNull() lookup in filters.
Thanks Florian Apolloner for the report. Thanks Simon Charette for the review.
This commit is contained in:
		
				
					committed by
					
						 Mariusz Felisiak
						Mariusz Felisiak
					
				
			
			
				
	
			
			
			
						parent
						
							4525d689e9
						
					
				
				
					commit
					9f55489529
				
			| @@ -171,9 +171,10 @@ class Lookup(Expression): | ||||
|         c.lhs = self.lhs.resolve_expression( | ||||
|             query, allow_joins, reuse, summarize, for_save | ||||
|         ) | ||||
|         c.rhs = self.rhs.resolve_expression( | ||||
|             query, allow_joins, reuse, summarize, for_save | ||||
|         ) | ||||
|         if hasattr(self.rhs, "resolve_expression"): | ||||
|             c.rhs = self.rhs.resolve_expression( | ||||
|                 query, allow_joins, reuse, summarize, for_save | ||||
|             ) | ||||
|         return c | ||||
|  | ||||
|     def select_format(self, compiler, sql, params): | ||||
|   | ||||
| @@ -11,3 +11,6 @@ Bugfixes | ||||
|  | ||||
| * Fixed a bug in Django 4.0 where not all :setting:`OPTIONS <CACHES-OPTIONS>` | ||||
|   were passed to a Redis client (:ticket:`33681`). | ||||
|  | ||||
| * Fixed a bug in Django 4.0 that caused a crash of ``QuerySet.filter()`` on | ||||
|   ``IsNull()`` expressions (:ticket:`33705`). | ||||
|   | ||||
| @@ -24,6 +24,7 @@ from django.db.models.lookups import ( | ||||
|     Exact, | ||||
|     GreaterThan, | ||||
|     GreaterThanOrEqual, | ||||
|     IsNull, | ||||
|     LessThan, | ||||
|     LessThanOrEqual, | ||||
| ) | ||||
| @@ -1284,7 +1285,7 @@ class LookupQueryingTests(TestCase): | ||||
|     @classmethod | ||||
|     def setUpTestData(cls): | ||||
|         cls.s1 = Season.objects.create(year=1942, gt=1942) | ||||
|         cls.s2 = Season.objects.create(year=1842, gt=1942) | ||||
|         cls.s2 = Season.objects.create(year=1842, gt=1942, nulled_text_field="text") | ||||
|         cls.s3 = Season.objects.create(year=2042, gt=1942) | ||||
|  | ||||
|     def test_annotate(self): | ||||
| @@ -1366,6 +1367,16 @@ class LookupQueryingTests(TestCase): | ||||
|         qs = Season.objects.filter(GreaterThan(F("year"), 1910)) | ||||
|         self.assertCountEqual(qs, [self.s1, self.s3]) | ||||
|  | ||||
|     def test_isnull_lookup_in_filter(self): | ||||
|         self.assertSequenceEqual( | ||||
|             Season.objects.filter(IsNull(F("nulled_text_field"), False)), | ||||
|             [self.s2], | ||||
|         ) | ||||
|         self.assertCountEqual( | ||||
|             Season.objects.filter(IsNull(F("nulled_text_field"), True)), | ||||
|             [self.s1, self.s3], | ||||
|         ) | ||||
|  | ||||
|     def test_filter_lookup_lhs(self): | ||||
|         qs = Season.objects.annotate(before_20=LessThan(F("year"), 2000)).filter( | ||||
|             before_20=LessThan(F("year"), 1900), | ||||
|   | ||||
		Reference in New Issue
	
	Block a user