Commit 1690b92b authored by Andriy Sokolovskiy's avatar Andriy Sokolovskiy Committed by Tim Graham
Browse files

[1.7.x] Fixed #23987 -- Made SQLite SchemaEditor always use effective_default().

Backport of 08904733 from master
parent eb632bfb
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -69,8 +69,8 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
        # Add in any created fields
        for field in create_fields:
            body[field.name] = field
            # If there's a default, insert it into the copy map
            if field.has_default():
            # Choose a default and insert it into the copy map
            if not isinstance(field, ManyToManyField):
                mapping[field.column] = self.quote_value(
                    self.effective_default(field)
                )
+5 −0
Original line number Diff line number Diff line
@@ -135,3 +135,8 @@ Bugfixes
  growth in Django's own test suite (:ticket:`23969`).

* Fixed timesince filter translations in Korean (:ticket:`23989`).

* Fixed the SQLite ``SchemaEditor`` to properly add defaults in the absence of
  a user specified ``default``. For example, a ``CharField`` with ``blank=True``
  didn't set existing rows to an empty string which resulted in a crash when
  adding the ``NOT NULL`` constraint (:ticket:`23987`).
+24 −0
Original line number Diff line number Diff line
@@ -1180,3 +1180,27 @@ class SchemaTests(TransactionTestCase):
                }
            )
            editor.alter_field(model, get_field(Author, field_class=ForeignKey), field)

    def test_add_field_use_effective_default(self):
        """
        #23987 - effective_default() should be used as the field default when
        adding a new field.
        """
        # Create the table
        with connection.schema_editor() as editor:
            editor.create_model(Author)
        # Ensure there's no surname field
        columns = self.column_classes(Author)
        self.assertNotIn("surname", columns)
        # Create a row
        Author.objects.create(name='Anonymous1')
        # Add new CharField to ensure default will be used from effective_default
        new_field = CharField(max_length=15, blank=True)
        new_field.set_attributes_from_name("surname")
        with connection.schema_editor() as editor:
            editor.add_field(Author, new_field)
        # Ensure field was added with the right default
        with connection.cursor() as cursor:
            cursor.execute("SELECT surname FROM schema_author;")
            item = cursor.fetchall()[0]
            self.assertEqual(item[0], '')