summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2014-08-03 15:02:40 -0400
committerSimon Charette <charette.s@gmail.com>2014-08-03 15:27:01 -0400
commitcbb29af1aa1ebe11b38e73a6f34df9cd171d6c5b (patch)
treecf295145dbc4f9027d26db2553f9bfff1fbba49e /django
parent2d542bf60cc37c59872c5a20d6af3bf826038739 (diff)
Fixed #23160 -- Correctly rename models with self referential fields.
Thanks to whitews AT gmail for the report.
Diffstat (limited to 'django')
-rw-r--r--django/db/migrations/operations/models.py26
1 files changed, 19 insertions, 7 deletions
diff --git a/django/db/migrations/operations/models.py b/django/db/migrations/operations/models.py
index 4e8100a5bb..5b1a23eab7 100644
--- a/django/db/migrations/operations/models.py
+++ b/django/db/migrations/operations/models.py
@@ -124,10 +124,14 @@ class RenameModel(Operation):
del state.models[app_label, self.old_name.lower()]
# Repoint the FKs and M2Ms pointing to us
for related_object in (related_objects + related_m2m_objects):
- related_key = (
- related_object.model._meta.app_label,
- related_object.model._meta.object_name.lower(),
- )
+ # Use the new related key for self referential related objects.
+ if related_object.model == model:
+ related_key = (app_label, self.new_name.lower())
+ else:
+ related_key = (
+ related_object.model._meta.app_label,
+ related_object.model._meta.object_name.lower(),
+ )
new_fields = []
for name, field in state.models[related_key].fields:
if name == related_object.field.name:
@@ -152,12 +156,20 @@ class RenameModel(Operation):
related_objects = old_model._meta.get_all_related_objects()
related_m2m_objects = old_model._meta.get_all_related_many_to_many_objects()
for related_object in (related_objects + related_m2m_objects):
+ if related_object.model == old_model:
+ model = new_model
+ related_key = (app_label, self.new_name.lower())
+ else:
+ model = related_object.model
+ related_key = (
+ related_object.model._meta.app_label,
+ related_object.model._meta.object_name.lower(),
+ )
to_field = new_apps.get_model(
- related_object.model._meta.app_label,
- related_object.model._meta.object_name.lower(),
+ *related_key
)._meta.get_field_by_name(related_object.field.name)[0]
schema_editor.alter_field(
- related_object.model,
+ model,
related_object.field,
to_field,
)