summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHasan Ramezani <hasan.r67@gmail.com>2020-12-13 22:41:20 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-02-19 11:19:01 +0100
commit7c18b22e2fa70aa8dcfadb33beb17933abdf7ee4 (patch)
treef513fa6078dac88f1f040ae44ecdd2763a60074b
parentab58f072502e86dfe21b2bd5cccdc5e94dce8d26 (diff)
Fixed #32256 -- Fixed migration optimization crash when swapping field names.
This disables optimization of RenameField operation when an old field name is referenced in subsequent operations. Co-authored-by: InvalidInterrupt <InvalidInterrupt@users.noreply.github.com>
-rw-r--r--django/db/migrations/operations/fields.py7
-rw-r--r--tests/migrations/test_optimizer.py17
2 files changed, 22 insertions, 2 deletions
diff --git a/django/db/migrations/operations/fields.py b/django/db/migrations/operations/fields.py
index 8e494fd595..728105ea05 100644
--- a/django/db/migrations/operations/fields.py
+++ b/django/db/migrations/operations/fields.py
@@ -392,8 +392,11 @@ class RenameField(FieldOperation):
),
]
# Skip `FieldOperation.reduce` as we want to run `references_field`
- # against self.new_name.
+ # against self.old_name and self.new_name.
return (
super(FieldOperation, self).reduce(operation, app_label) or
- not operation.references_field(self.model_name, self.new_name, app_label)
+ not (
+ operation.references_field(self.model_name, self.old_name, app_label) or
+ operation.references_field(self.model_name, self.new_name, app_label)
+ )
)
diff --git a/tests/migrations/test_optimizer.py b/tests/migrations/test_optimizer.py
index 9bb1aafebd..0caaf66f9e 100644
--- a/tests/migrations/test_optimizer.py
+++ b/tests/migrations/test_optimizer.py
@@ -572,6 +572,23 @@ class OptimizerTests(SimpleTestCase):
],
)
+ def test_swapping_fields_names(self):
+ self.assertDoesNotOptimize(
+ [
+ migrations.CreateModel(
+ 'MyModel',
+ [
+ ('field_a', models.IntegerField()),
+ ('field_b', models.IntegerField()),
+ ],
+ ),
+ migrations.RunPython(migrations.RunPython.noop),
+ migrations.RenameField('MyModel', 'field_a', 'field_c'),
+ migrations.RenameField('MyModel', 'field_b', 'field_a'),
+ migrations.RenameField('MyModel', 'field_c', 'field_b'),
+ ],
+ )
+
def test_create_model_remove_field(self):
"""
RemoveField should optimize into CreateModel.