diff options
| author | Markus Holtermann <info@markusholtermann.eu> | 2015-06-13 00:21:07 +0200 |
|---|---|---|
| committer | Markus Holtermann <info@markusholtermann.eu> | 2015-06-16 00:43:22 +0200 |
| commit | e470f311d654267ec86f9a6325ec500345b9dff2 (patch) | |
| tree | 7271cf713c2c3d797be24aa8d9ca7b2c97179abd /django | |
| parent | fb1ba4d63e76c418c2dd6214dabe4dcf25ab3bad (diff) | |
Fixed #24828 -- Allowed migration optimization across AlterFooTogether
The idea behind this change is, that AlterUniqueTogether,
AlterIndexTogether and AlterOrderWithRespectTo can always be moved after
an Add/Alter/Rename/RemoveField operation if they don't refer to the
respective field and are not empty sets / None.
Combined with the optimizations of duplicate AlterUniqueTogether,
AlterIndexTogether, and AlterOrderWithRespectTo operations from
128caa1e16ec2627737748f75c8e55600a3df97f, these operations are optimized
in a later round of the optimizer.
Thanks Tim Graham for the review.
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/migrations/operations/models.py | 27 | ||||
| -rw-r--r-- | django/db/migrations/optimizer.py | 24 |
2 files changed, 51 insertions, 0 deletions
diff --git a/django/db/migrations/operations/models.py b/django/db/migrations/operations/models.py index 69998331fb..2855107e0e 100644 --- a/django/db/migrations/operations/models.py +++ b/django/db/migrations/operations/models.py @@ -365,6 +365,15 @@ class AlterUniqueTogether(Operation): def references_model(self, name, app_label=None): return name.lower() == self.name_lower + def references_field(self, model_name, name, app_label=None): + return ( + self.references_model(model_name, app_label) and + ( + not self.unique_together or + any((name in together) for together in self.unique_together) + ) + ) + def describe(self): return "Alter %s for %s (%s constraint(s))" % (self.option_name, self.name, len(self.unique_together or '')) @@ -417,6 +426,15 @@ class AlterIndexTogether(Operation): def references_model(self, name, app_label=None): return name.lower() == self.name_lower + def references_field(self, model_name, name, app_label=None): + return ( + self.references_model(model_name, app_label) and + ( + not self.index_together or + any((name in together) for together in self.index_together) + ) + ) + def describe(self): return "Alter %s for %s (%s constraint(s))" % (self.option_name, self.name, len(self.index_together or '')) @@ -474,6 +492,15 @@ class AlterOrderWithRespectTo(Operation): def references_model(self, name, app_label=None): return name.lower() == self.name_lower + def references_field(self, model_name, name, app_label=None): + return ( + self.references_model(model_name, app_label) and + ( + self.order_with_respect_to is None or + name == self.order_with_respect_to + ) + ) + def describe(self): return "Set order_with_respect_to on %s to %s" % (self.name, self.order_with_respect_to) diff --git a/django/db/migrations/optimizer.py b/django/db/migrations/optimizer.py index 556436b96d..96909e748e 100644 --- a/django/db/migrations/optimizer.py +++ b/django/db/migrations/optimizer.py @@ -56,6 +56,20 @@ class MigrationOptimizer(object): (AlterField, RenameField): self.reduce_alter_field_rename_field, (CreateModel, RenameField): self.reduce_create_model_rename_field, (RenameField, RenameField): self.reduce_rename_field_self, + + (AlterIndexTogether, AddField): self.reduce_alter_model_addalterremove_field, + (AlterIndexTogether, AlterField): self.reduce_alter_model_addalterremove_field, + (AlterIndexTogether, RemoveField): self.reduce_alter_model_addalterremove_field, + (AlterOrderWithRespectTo, AddField): self.reduce_alter_model_addalterremove_field, + (AlterOrderWithRespectTo, AlterField): self.reduce_alter_model_addalterremove_field, + (AlterOrderWithRespectTo, RemoveField): self.reduce_alter_model_addalterremove_field, + (AlterUniqueTogether, AddField): self.reduce_alter_model_addalterremove_field, + (AlterUniqueTogether, AlterField): self.reduce_alter_model_addalterremove_field, + (AlterUniqueTogether, RemoveField): self.reduce_alter_model_addalterremove_field, + + (AlterIndexTogether, RenameField): self.reduce_alter_model_rename_field, + (AlterOrderWithRespectTo, RenameField): self.reduce_alter_model_rename_field, + (AlterUniqueTogether, RenameField): self.reduce_alter_model_rename_field, } def optimize(self, operations, app_label=None): @@ -310,6 +324,16 @@ class MigrationOptimizer(object): ), ] + def reduce_alter_model_addalterremove_field(self, operation, other, in_between): + if (operation.name_lower == other.model_name_lower and + not operation.references_field(other.model_name, other.name)): + return [other, operation] + + def reduce_alter_model_rename_field(self, operation, other, in_between): + if (operation.name_lower == other.model_name_lower and + not operation.references_field(other.model_name, other.old_name)): + return [other, operation] + # THROUGH CHECKS def can_optimize_through(self, operation, other, app_label=None): |
