mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[3.2.x] Fixed #32645 -- Fixed QuerySet.update() crash when ordered by joined fields on MySQL/MariaDB.
Thanks Matt Westcott for the report. Regression in779e615e36. Backport ofca98729055from main
This commit is contained in:
		| @@ -7,7 +7,10 @@ from django.db.models.functions import Abs, Concat, Lower | ||||
| from django.test import TestCase | ||||
| from django.test.utils import register_lookup | ||||
|  | ||||
| from .models import A, B, Bar, D, DataPoint, Foo, RelatedPoint, UniqueNumber | ||||
| from .models import ( | ||||
|     A, B, Bar, D, DataPoint, Foo, RelatedPoint, UniqueNumber, | ||||
|     UniqueNumberChild, | ||||
| ) | ||||
|  | ||||
|  | ||||
| class SimpleTest(TestCase): | ||||
| @@ -249,3 +252,26 @@ class MySQLUpdateOrderByTest(TestCase): | ||||
|             ).order_by('number_inverse').update( | ||||
|                 number=F('number') + 1, | ||||
|             ) | ||||
|  | ||||
|     def test_order_by_update_on_parent_unique_constraint(self): | ||||
|         # Ordering by inherited fields is omitted because joined fields cannot | ||||
|         # be used in the ORDER BY clause. | ||||
|         UniqueNumberChild.objects.create(number=3) | ||||
|         UniqueNumberChild.objects.create(number=4) | ||||
|         with self.assertRaises(IntegrityError): | ||||
|             UniqueNumberChild.objects.order_by('number').update( | ||||
|                 number=F('number') + 1, | ||||
|             ) | ||||
|  | ||||
|     def test_order_by_update_on_related_field(self): | ||||
|         # Ordering by related fields is omitted because joined fields cannot be | ||||
|         # used in the ORDER BY clause. | ||||
|         data = DataPoint.objects.create(name='d0', value='apple') | ||||
|         related = RelatedPoint.objects.create(name='r0', data=data) | ||||
|         with self.assertNumQueries(1) as ctx: | ||||
|             updated = RelatedPoint.objects.order_by('data__name').update(name='new') | ||||
|         sql = ctx.captured_queries[0]['sql'] | ||||
|         self.assertNotIn('ORDER BY', sql) | ||||
|         self.assertEqual(updated, 1) | ||||
|         related.refresh_from_db() | ||||
|         self.assertEqual(related.name, 'new') | ||||
|   | ||||
		Reference in New Issue
	
	Block a user