1
0
mirror of https://github.com/django/django.git synced 2025-10-24 14:16:09 +00:00

Fixed #23160 -- Correctly rename models with self referential fields.

Thanks to whitews AT gmail for the report.
This commit is contained in:
Simon Charette
2014-08-03 15:02:40 -04:00
parent 2d542bf60c
commit cbb29af1aa
2 changed files with 56 additions and 7 deletions

View File

@@ -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,
)