diff options
| author | Simon Charette <charette.s@gmail.com> | 2021-10-15 13:11:02 -0400 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-10-19 06:46:35 +0200 |
| commit | 5896aa8367d545c60bb544c31d7ecaaecc321045 (patch) | |
| tree | cae0e59b25132c108d89d9925596057898a10a55 /django | |
| parent | 69b0736fad1d1f0197409ca025b7bcdf5666ae62 (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.py | 19 | ||||
| -rw-r--r-- | django/db/migrations/operations/fields.py | 6 |
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( |
