mirror of
https://github.com/django/django.git
synced 2025-06-05 03:29:12 +00:00
[1.7.x] Fixed #24354 -- Prevented repointing of relations on superclasses when migrating a subclass's name change
This commit is contained in:
parent
0094ad227d
commit
d0607a7eee
@ -122,6 +122,10 @@ class RenameModel(Operation):
|
|||||||
del state.models[app_label, self.old_name.lower()]
|
del state.models[app_label, self.old_name.lower()]
|
||||||
# Repoint the FKs and M2Ms pointing to us
|
# Repoint the FKs and M2Ms pointing to us
|
||||||
for related_object in (related_objects + related_m2m_objects):
|
for related_object in (related_objects + related_m2m_objects):
|
||||||
|
if related_object.field.rel.to is not model:
|
||||||
|
# The model being renamed does not participate in this relation
|
||||||
|
# directly. Rather, a superclass does.
|
||||||
|
continue
|
||||||
# Use the new related key for self referential related objects.
|
# Use the new related key for self referential related objects.
|
||||||
if related_object.model == model:
|
if related_object.model == model:
|
||||||
related_key = (app_label, self.new_name.lower())
|
related_key = (app_label, self.new_name.lower())
|
||||||
|
@ -9,4 +9,6 @@ Django 1.7.7 fixes several bugs in 1.7.6.
|
|||||||
Bugfixes
|
Bugfixes
|
||||||
========
|
========
|
||||||
|
|
||||||
* ...
|
* Fixed renaming of classes in migrations where renaming a subclass would
|
||||||
|
cause incorrect state to be recorded for objects that referenced the
|
||||||
|
superclass (:ticket:`24354`).
|
||||||
|
@ -482,6 +482,41 @@ class OperationTests(OperationTestBase):
|
|||||||
self.assertFKExists("test_rmwsrf_rider", ["friend_id"], ("test_rmwsrf_rider", "id"))
|
self.assertFKExists("test_rmwsrf_rider", ["friend_id"], ("test_rmwsrf_rider", "id"))
|
||||||
self.assertFKNotExists("test_rmwsrf_rider", ["friend_id"], ("test_rmwsrf_horserider", "id"))
|
self.assertFKNotExists("test_rmwsrf_rider", ["friend_id"], ("test_rmwsrf_horserider", "id"))
|
||||||
|
|
||||||
|
def test_rename_model_with_superclass_fk(self):
|
||||||
|
"""
|
||||||
|
Tests the RenameModel operation on a model which has a superclass that
|
||||||
|
has a foreign key.
|
||||||
|
"""
|
||||||
|
project_state = self.set_up_test_model("test_rmwsc", related_model=True, mti_model=True)
|
||||||
|
# Test the state alteration
|
||||||
|
operation = migrations.RenameModel("ShetlandPony", "LittleHorse")
|
||||||
|
self.assertEqual(operation.describe(), "Rename model ShetlandPony to LittleHorse")
|
||||||
|
new_state = project_state.clone()
|
||||||
|
operation.state_forwards("test_rmwsc", new_state)
|
||||||
|
self.assertNotIn(("test_rmwsc", "shetlandpony"), new_state.models)
|
||||||
|
self.assertIn(("test_rmwsc", "littlehorse"), new_state.models)
|
||||||
|
# RenameModel shouldn't repoint the superclass's relations, only local ones
|
||||||
|
self.assertEqual(
|
||||||
|
project_state.models["test_rmwsc", "rider"].fields[1][1].rel.to,
|
||||||
|
new_state.models["test_rmwsc", "rider"].fields[1][1].rel.to
|
||||||
|
)
|
||||||
|
# Before running the migration we have a table for Shetland Pony, not Little Horse
|
||||||
|
self.assertTableExists("test_rmwsc_shetlandpony")
|
||||||
|
self.assertTableNotExists("test_rmwsc_littlehorse")
|
||||||
|
if connection.features.supports_foreign_keys:
|
||||||
|
# and the foreign key on rider points to pony, not shetland pony
|
||||||
|
self.assertFKExists("test_rmwsc_rider", ["pony_id"], ("test_rmwsc_pony", "id"))
|
||||||
|
self.assertFKNotExists("test_rmwsc_rider", ["pony_id"], ("test_rmwsc_shetlandpony", "id"))
|
||||||
|
with connection.schema_editor() as editor:
|
||||||
|
operation.database_forwards("test_rmwsc", editor, project_state, new_state)
|
||||||
|
# Now we have a little horse table, not shetland pony
|
||||||
|
self.assertTableNotExists("test_rmwsc_shetlandpony")
|
||||||
|
self.assertTableExists("test_rmwsc_littlehorse")
|
||||||
|
if connection.features.supports_foreign_keys:
|
||||||
|
# but the Foreign keys still point at pony, not little horse
|
||||||
|
self.assertFKExists("test_rmwsc_rider", ["pony_id"], ("test_rmwsc_pony", "id"))
|
||||||
|
self.assertFKNotExists("test_rmwsc_rider", ["pony_id"], ("test_rmwsc_littlehorse", "id"))
|
||||||
|
|
||||||
def test_rename_model_with_self_referential_m2m(self):
|
def test_rename_model_with_self_referential_m2m(self):
|
||||||
app_label = "test_rename_model_with_self_referential_m2m"
|
app_label = "test_rename_model_with_self_referential_m2m"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user