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):
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):
"""

View File

@ -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')},
)