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:
@@ -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,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user