diff options
| author | Vytis Banaitis <vytis.banaitis@gmail.com> | 2016-05-10 23:20:27 +0300 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-05-30 10:27:28 -0400 |
| commit | b737c0f5db8fe8499d39c39d2442eaee595ca0fd (patch) | |
| tree | 180e9eed129bdae1633ba3d307d36dd23f24fb24 /django | |
| parent | ab92351bc6b58316250c1748cc6dbf55cdba03d2 (diff) | |
[1.10.x] Fixed #25044 -- Fixed migrations for renaming ManyToManyField's through model.
Backport of f1e408ff40d2c1753f92515c70a44634b4d47467 from master
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/migrations/autodetector.py | 7 | ||||
| -rw-r--r-- | django/db/migrations/operations/models.py | 22 |
2 files changed, 29 insertions, 0 deletions
diff --git a/django/db/migrations/autodetector.py b/django/db/migrations/autodetector.py index 08baf473b0..ae88a90465 100644 --- a/django/db/migrations/autodetector.py +++ b/django/db/migrations/autodetector.py @@ -867,6 +867,13 @@ class MigrationAutodetector(object): ) if rename_key in self.renamed_models: new_field.remote_field.model = old_field.remote_field.model + if hasattr(new_field, "remote_field") and getattr(new_field.remote_field, "through", None): + rename_key = ( + new_field.remote_field.through._meta.app_label, + new_field.remote_field.through._meta.model_name, + ) + if rename_key in self.renamed_models: + 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: diff --git a/django/db/migrations/operations/models.py b/django/db/migrations/operations/models.py index 10af84cc47..d18fded97c 100644 --- a/django/db/migrations/operations/models.py +++ b/django/db/migrations/operations/models.py @@ -307,6 +307,28 @@ class RenameModel(ModelOperation): new_fields.append((name, field)) state.models[related_key].fields = new_fields state.reload_model(*related_key) + # Repoint M2Ms with through pointing to us + related_models = { + f.remote_field.model for f in model._meta.fields + if getattr(f.remote_field, 'model', None) + } + model_name = '%s.%s' % (app_label, self.old_name) + for related_model in related_models: + if related_model == model: + related_key = (app_label, self.new_name_lower) + else: + related_key = (related_model._meta.app_label, related_model._meta.model_name) + new_fields = [] + changed = False + for name, field in state.models[related_key].fields: + if field.is_relation and field.many_to_many and field.remote_field.through == model_name: + field = field.clone() + field.remote_field.through = '%s.%s' % (app_label, self.new_name) + changed = True + new_fields.append((name, field)) + if changed: + state.models[related_key].fields = new_fields + state.reload_model(*related_key) state.reload_model(app_label, self.new_name_lower) def database_forwards(self, app_label, schema_editor, from_state, to_state): |
