summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2021-10-15 13:11:02 -0400
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-10-19 06:46:35 +0200
commit5896aa8367d545c60bb544c31d7ecaaecc321045 (patch)
treecae0e59b25132c108d89d9925596057898a10a55 /django
parent69b0736fad1d1f0197409ca025b7bcdf5666ae62 (diff)
Fixed #33197 -- Made field rename with prior matching db_column change a noop.
Thanks Jacob Walls for the report.
Diffstat (limited to 'django')
-rw-r--r--django/db/migrations/autodetector.py19
-rw-r--r--django/db/migrations/operations/fields.py6
2 files changed, 23 insertions, 2 deletions
diff --git a/django/db/migrations/autodetector.py b/django/db/migrations/autodetector.py
index 3cd8a43084..d3ac1c93ab 100644
--- a/django/db/migrations/autodetector.py
+++ b/django/db/migrations/autodetector.py
@@ -840,6 +840,20 @@ class MigrationAutodetector:
old_field_dec[0:2] == field_dec[0:2] and
dict(old_field_dec[2], db_column=old_db_column) == field_dec[2])):
if self.questioner.ask_rename(model_name, rem_field_name, field_name, field):
+ # A db_column mismatch requires a prior noop
+ # AlterField for the subsequent RenameField to be a
+ # noop on attempts at preserving the old name.
+ if old_field.db_column != field.db_column:
+ altered_field = field.clone()
+ altered_field.name = rem_field_name
+ self.add_operation(
+ app_label,
+ operations.AlterField(
+ model_name=model_name,
+ name=rem_field_name,
+ field=altered_field,
+ ),
+ )
self.add_operation(
app_label,
operations.RenameField(
@@ -970,7 +984,10 @@ class MigrationAutodetector:
new_field.remote_field.through = old_field.remote_field.through
old_field_dec = self.deep_deconstruct(old_field)
new_field_dec = self.deep_deconstruct(new_field)
- if old_field_dec != new_field_dec:
+ # If the field was confirmed to be renamed it means that only
+ # db_column was allowed to change which generate_renamed_fields()
+ # already accounts for by adding an AlterField operation.
+ if old_field_dec != new_field_dec and old_field_name == field_name:
both_m2m = old_field.many_to_many and new_field.many_to_many
neither_m2m = not old_field.many_to_many and not new_field.many_to_many
if both_m2m or neither_m2m:
diff --git a/django/db/migrations/operations/fields.py b/django/db/migrations/operations/fields.py
index 641c142191..094c3e3cda 100644
--- a/django/db/migrations/operations/fields.py
+++ b/django/db/migrations/operations/fields.py
@@ -239,7 +239,11 @@ class AlterField(FieldOperation):
def reduce(self, operation, app_label):
if isinstance(operation, RemoveField) and self.is_same_field_operation(operation):
return [operation]
- elif isinstance(operation, RenameField) and self.is_same_field_operation(operation):
+ elif (
+ isinstance(operation, RenameField) and
+ self.is_same_field_operation(operation) and
+ self.field.db_column is None
+ ):
return [
operation,
AlterField(