Fixed #33402 -- Optimized multiple AlterFooTogether operations.

This commit is contained in:
David Wobrock 2022-01-04 06:24:03 +01:00 committed by GitHub
parent 0ed2919814
commit 482ee63b6f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 32 deletions

View File

@ -34,9 +34,12 @@ class ModelOperation(Operation):
def reduce(self, operation, app_label): def reduce(self, operation, app_label):
return ( return (
super().reduce(operation, app_label) or 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): class CreateModel(ModelOperation):
"""Create a model's table.""" """Create a model's table."""
@ -528,6 +531,14 @@ class AlterTogetherOptionOperation(ModelOptionOperation):
def migration_name_fragment(self): def migration_name_fragment(self):
return 'alter_%s_%s' % (self.name_lower, self.option_name) 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): class AlterUniqueTogether(AlterTogetherOptionOperation):
""" """

View File

@ -1573,21 +1573,13 @@ class AutodetectorTests(TestCase):
self.assertOperationTypes(changes, 'otherapp', 0, [ self.assertOperationTypes(changes, 'otherapp', 0, [
'AlterUniqueTogether', 'AlterUniqueTogether',
'AlterIndexTogether', 'AlterIndexTogether',
'AlterUniqueTogether',
'AlterIndexTogether',
]) ])
self.assertOperationAttributes( self.assertOperationAttributes(
changes, 'otherapp', 0, 0, name='book', unique_together=set(), changes, 'otherapp', 0, 0, name='book',
)
self.assertOperationAttributes(
changes, 'otherapp', 0, 1, name='book', index_together=set(),
)
self.assertOperationAttributes(
changes, 'otherapp', 0, 2, name='book',
unique_together={('title', 'author')}, unique_together={('title', 'author')},
) )
self.assertOperationAttributes( self.assertOperationAttributes(
changes, 'otherapp', 0, 3, name='book', changes, 'otherapp', 0, 1, name='book',
index_together={('title', 'author')}, index_together={('title', 'author')},
) )
@ -1637,28 +1629,20 @@ class AutodetectorTests(TestCase):
# Right number/type of migrations? # Right number/type of migrations?
self.assertNumberMigrations(changes, "otherapp", 1) self.assertNumberMigrations(changes, "otherapp", 1)
self.assertOperationTypes(changes, 'otherapp', 0, [ self.assertOperationTypes(changes, 'otherapp', 0, [
'AlterUniqueTogether',
'AlterIndexTogether',
'AlterUniqueTogether', 'AlterUniqueTogether',
'AlterIndexTogether', 'AlterIndexTogether',
'RemoveField', 'RemoveField',
]) ])
self.assertOperationAttributes( self.assertOperationAttributes(
changes, 'otherapp', 0, 0, name='book', unique_together=set(), changes, 'otherapp', 0, 0, name='book',
)
self.assertOperationAttributes(
changes, 'otherapp', 0, 1, name='book', index_together=set(),
)
self.assertOperationAttributes(
changes, 'otherapp', 0, 2, name='book',
unique_together={('author', 'title')}, unique_together={('author', 'title')},
) )
self.assertOperationAttributes( self.assertOperationAttributes(
changes, 'otherapp', 0, 3, name='book', changes, 'otherapp', 0, 1, name='book',
index_together={('author', 'title')}, index_together={('author', 'title')},
) )
self.assertOperationAttributes( 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): def test_alter_field_and_foo_together(self):
@ -1744,21 +1728,13 @@ class AutodetectorTests(TestCase):
'RenameField', 'RenameField',
'AlterUniqueTogether', 'AlterUniqueTogether',
'AlterIndexTogether', 'AlterIndexTogether',
'AlterUniqueTogether',
'AlterIndexTogether',
]) ])
self.assertOperationAttributes( self.assertOperationAttributes(
changes, 'otherapp', 0, 1, name='book', unique_together=set(), changes, 'otherapp', 0, 1, name='book',
)
self.assertOperationAttributes(
changes, 'otherapp', 0, 2, name='book', index_together=set(),
)
self.assertOperationAttributes(
changes, 'otherapp', 0, 3, name='book',
unique_together={('title', 'newfield2')}, unique_together={('title', 'newfield2')},
) )
self.assertOperationAttributes( self.assertOperationAttributes(
changes, 'otherapp', 0, 4, name='book', changes, 'otherapp', 0, 2, name='book',
index_together={('title', 'newfield2')}, index_together={('title', 'newfield2')},
) )