mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #33402 -- Optimized multiple AlterFooTogether operations.
This commit is contained in:
		| @@ -34,9 +34,12 @@ class ModelOperation(Operation): | ||||
|     def reduce(self, operation, app_label): | ||||
|         return ( | ||||
|             super().reduce(operation, app_label) or | ||||
|             not operation.references_model(self.name, app_label) | ||||
|             self.can_reduce_through(operation, app_label) | ||||
|         ) | ||||
|  | ||||
|     def can_reduce_through(self, operation, app_label): | ||||
|         return not operation.references_model(self.name, app_label) | ||||
|  | ||||
|  | ||||
| class CreateModel(ModelOperation): | ||||
|     """Create a model's table.""" | ||||
| @@ -528,6 +531,14 @@ class AlterTogetherOptionOperation(ModelOptionOperation): | ||||
|     def migration_name_fragment(self): | ||||
|         return 'alter_%s_%s' % (self.name_lower, self.option_name) | ||||
|  | ||||
|     def can_reduce_through(self, operation, app_label): | ||||
|         return ( | ||||
|             super().can_reduce_through(operation, app_label) or ( | ||||
|                 isinstance(operation, AlterTogetherOptionOperation) and | ||||
|                 type(operation) is not type(self) | ||||
|             ) | ||||
|         ) | ||||
|  | ||||
|  | ||||
| class AlterUniqueTogether(AlterTogetherOptionOperation): | ||||
|     """ | ||||
|   | ||||
| @@ -1573,21 +1573,13 @@ class AutodetectorTests(TestCase): | ||||
|         self.assertOperationTypes(changes, 'otherapp', 0, [ | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|         ]) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 0, name='book', unique_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 1, name='book', index_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 2, name='book', | ||||
|             changes, 'otherapp', 0, 0, name='book', | ||||
|             unique_together={('title', 'author')}, | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 3, name='book', | ||||
|             changes, 'otherapp', 0, 1, name='book', | ||||
|             index_together={('title', 'author')}, | ||||
|         ) | ||||
|  | ||||
| @@ -1637,28 +1629,20 @@ class AutodetectorTests(TestCase): | ||||
|         # Right number/type of migrations? | ||||
|         self.assertNumberMigrations(changes, "otherapp", 1) | ||||
|         self.assertOperationTypes(changes, 'otherapp', 0, [ | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|             'RemoveField', | ||||
|         ]) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 0, name='book', unique_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 1, name='book', index_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 2, name='book', | ||||
|             changes, 'otherapp', 0, 0, name='book', | ||||
|             unique_together={('author', 'title')}, | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 3, name='book', | ||||
|             changes, 'otherapp', 0, 1, name='book', | ||||
|             index_together={('author', 'title')}, | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 4, model_name='book', name='newfield', | ||||
|             changes, 'otherapp', 0, 2, model_name='book', name='newfield', | ||||
|         ) | ||||
|  | ||||
|     def test_alter_field_and_foo_together(self): | ||||
| @@ -1744,21 +1728,13 @@ class AutodetectorTests(TestCase): | ||||
|             'RenameField', | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|         ]) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 1, name='book', unique_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 2, name='book', index_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 3, name='book', | ||||
|             changes, 'otherapp', 0, 1, name='book', | ||||
|             unique_together={('title', 'newfield2')}, | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 4, name='book', | ||||
|             changes, 'otherapp', 0, 2, name='book', | ||||
|             index_together={('title', 'newfield2')}, | ||||
|         ) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user