Commit 4680d25d authored by Andrew Pinkham's avatar Andrew Pinkham Committed by Tim Graham
Browse files

Fixed #22951 -- Checked for types during deep_deconstruct migration serialization process.

Thanks Sam Hartsfield for the report.
parent f36ab2d3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ class MigrationAutodetector(object):
        Used for full comparison for rename/alter; sometimes a single-level
        deconstruction will not compare correctly.
        """
        if not hasattr(obj, 'deconstruct'):
        if not hasattr(obj, 'deconstruct') or isinstance(obj, type):
            return obj
        deconstructed = obj.deconstruct()
        if isinstance(obj, models.Field):
+2 −0
Original line number Diff line number Diff line
@@ -16,3 +16,5 @@ Bugfixes

* Reinstated missing ``CHECK`` SQL clauses which were omitted on some backends
  when not using migrations (:ticket:`23416`).

* Fixed serialization of ``type`` objects in migrations (:ticket:`22951`).
+25 −0
Original line number Diff line number Diff line
@@ -702,6 +702,31 @@ class AutodetectorTests(TestCase):
        changes = autodetector._detect_changes()
        self.assertEqual(changes, {})

    def test_deconstruct_type(self):
        """
        #22951 -- Uninstanted classes with deconstruct are correctly returned
        by deep_deconstruct during serialization.
        """
        author = ModelState(
            "testapp",
            "Author",
            [
                ("id", models.AutoField(primary_key=True)),
                ("name", models.CharField(
                    max_length=200,
                    # IntegerField intentionally not instantiated.
                    default=models.IntegerField,
                ))
            ],
        )
        # Make state
        before = self.make_project_state([])
        after = self.make_project_state([author])
        autodetector = MigrationAutodetector(before, after)
        changes = autodetector._detect_changes()
        self.assertNumberMigrations(changes, 'testapp', 1)
        self.assertOperationTypes(changes, 'testapp', 0, ["CreateModel"])

    def test_replace_string_with_foreignkey(self):
        """
        Adding an FK in the same "spot" as a deleted CharField should work. (#22300).