Fixed #33402 -- Optimized multiple AlterFooTogether operations.
This commit is contained in:
parent
0ed2919814
commit
482ee63b6f
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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')},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue