Commit 463952d9 authored by Sergey Fedoseev's avatar Sergey Fedoseev Committed by Tim Graham
Browse files

Fixed #23503 -- Fixed renaming of model with self-referential m2m field.

parent 83cd1863
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -724,6 +724,12 @@ class BaseDatabaseSchemaEditor(object):
            old_field.rel.through._meta.get_field_by_name(old_field.m2m_reverse_field_name())[0],
            new_field.rel.through._meta.get_field_by_name(new_field.m2m_reverse_field_name())[0],
        )
        self.alter_field(
            new_field.rel.through,
            # for self-referential models we need to alter field from the other end too
            old_field.rel.through._meta.get_field_by_name(old_field.m2m_field_name())[0],
            new_field.rel.through._meta.get_field_by_name(new_field.m2m_field_name())[0],
        )

    def _create_index_name(self, model, column_names, suffix=""):
        """
+3 −0
Original line number Diff line number Diff line
@@ -58,3 +58,6 @@ Bugfixes

* Added quoting of constraint names in the SQL generated by migrations to
  prevent crash with uppercase characters in the name (:ticket:`23065`).

* Fixed renaming of models with a self-referential many-to-many field
  (``ManyToManyField('self')``) (:ticket:`23503`).
+16 −0
Original line number Diff line number Diff line
@@ -472,6 +472,22 @@ class OperationTests(OperationTestBase):
            self.assertFKExists("test_rmwsrf_rider", ["friend_id"], ("test_rmwsrf_rider", "id"))
            self.assertFKNotExists("test_rmwsrf_rider", ["friend_id"], ("test_rmwsrf_horserider", "id"))

    def test_rename_model_with_self_referential_m2m(self):
        app_label = "test_rename_model_with_self_referential_m2m"

        project_state = self.apply_operations(app_label, ProjectState(), operations=[
            migrations.CreateModel("ReflexivePony", fields=[
                ("ponies", models.ManyToManyField("self")),
            ]),
        ])
        project_state = self.apply_operations(app_label, project_state, operations=[
            migrations.RenameModel("ReflexivePony", "ReflexivePony2"),
        ])
        apps = project_state.render()
        Pony = apps.get_model(app_label, "ReflexivePony2")
        pony = Pony.objects.create()
        pony.ponies.add(pony)

    def test_add_field(self):
        """
        Tests the AddField operation.