summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorVytis Banaitis <vytis.banaitis@gmail.com>2016-05-10 23:20:27 +0300
committerTim Graham <timograham@gmail.com>2016-05-30 10:27:28 -0400
commitb737c0f5db8fe8499d39c39d2442eaee595ca0fd (patch)
tree180e9eed129bdae1633ba3d307d36dd23f24fb24 /django
parentab92351bc6b58316250c1748cc6dbf55cdba03d2 (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.py7
-rw-r--r--django/db/migrations/operations/models.py22
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):