Commit f446acf8 authored by Markus Holtermann's avatar Markus Holtermann Committed by Tim Graham
Browse files

[1.7.x] Fixed #23956 -- Fixed migration creation for multiple table inheritance

Backport of 44927ba8 from master
parent 491bf20d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -471,7 +471,7 @@ class MigrationAutodetector(object):
                    if field.rel.to:
                        if field.primary_key:
                            primary_key_rel = field.rel.to
                        else:
                        elif not field.rel.parent_link:
                            related_fields[field.name] = field
                    # through will be none on M2Ms on swapped-out models;
                    # we can treat lack of through as auto_created=True, though.
+4 −0
Original line number Diff line number Diff line
@@ -115,3 +115,7 @@ Bugfixes
* Fixed index creation by the migration infrastructure, particularly when
  dealing with PostgreSQL specific {text|varchar}_pattern_ops indexes
  (:ticket:`23954`).

* Fixed bug in ``makemigrations`` that created broken migration files when
  dealing with multiple table inheritance and inheriting from more than one
  model (:ticket:`23956`).
+23 −0
Original line number Diff line number Diff line
@@ -1405,6 +1405,29 @@ class AutodetectorTests(TestCase):
        self.assertOperationAttributes(changes, 'testapp', 0, 0, name="Author")
        self.assertOperationAttributes(changes, 'testapp', 0, 1, name="Aardvark")

    def test_multiple_bases(self):
        """#23956 - Tests that inheriting models doesn't move *_ptr fields into AddField operations."""
        A = ModelState("app", "A", [("a_id", models.AutoField(primary_key=True))])
        B = ModelState("app", "B", [("b_id", models.AutoField(primary_key=True))])
        C = ModelState("app", "C", [], bases=("app.A", "app.B"))
        D = ModelState("app", "D", [], bases=("app.A", "app.B"))
        E = ModelState("app", "E", [], bases=("app.A", "app.B"))
        # Make state
        before = self.make_project_state([])
        after = self.make_project_state([A, B, C, D, E])
        autodetector = MigrationAutodetector(before, after)
        changes = autodetector._detect_changes()
        # Right number/type of migrations?
        self.assertNumberMigrations(changes, "app", 1)
        self.assertOperationTypes(changes, "app", 0, [
            "CreateModel", "CreateModel", "CreateModel", "CreateModel", "CreateModel"
        ])
        self.assertOperationAttributes(changes, "app", 0, 0, name="A")
        self.assertOperationAttributes(changes, "app", 0, 1, name="B")
        self.assertOperationAttributes(changes, "app", 0, 2, name="C")
        self.assertOperationAttributes(changes, "app", 0, 3, name="D")
        self.assertOperationAttributes(changes, "app", 0, 4, name="E")

    def test_proxy_bases_first(self):
        """Tests that bases of proxies come first."""
        # Make state