summaryrefslogtreecommitdiff
path: root/tests/schema/tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/schema/tests.py')
-rw-r--r--tests/schema/tests.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/tests/schema/tests.py b/tests/schema/tests.py
index cd7e4f638c..6046e4473d 100644
--- a/tests/schema/tests.py
+++ b/tests/schema/tests.py
@@ -1539,6 +1539,40 @@ class SchemaTests(TransactionTestCase):
Tag.objects.all().delete()
@isolate_apps('schema')
+ @unittest.skipIf(connection.vendor == 'sqlite', 'SQLite naively remakes the table on field alteration.')
+ @skipUnlessDBFeature('supports_foreign_keys')
+ def test_unique_no_unnecessary_fk_drops(self):
+ """
+ If AlterField isn't selective about dropping foreign key constraints
+ when modifying a field with a unique constraint, the AlterField
+ incorrectly drops and recreates the Book.author foreign key even though
+ it doesn't restrict the field being changed (#29193).
+ """
+ class Author(Model):
+ name = CharField(max_length=254, unique=True)
+
+ class Meta:
+ app_label = 'schema'
+
+ class Book(Model):
+ author = ForeignKey(Author, CASCADE)
+
+ class Meta:
+ app_label = 'schema'
+
+ with connection.schema_editor() as editor:
+ editor.create_model(Author)
+ editor.create_model(Book)
+ new_field = CharField(max_length=255, unique=True)
+ new_field.model = Author
+ new_field.set_attributes_from_name('name')
+ with patch_logger('django.db.backends.schema', 'debug') as logger_calls:
+ with connection.schema_editor() as editor:
+ editor.alter_field(Author, Author._meta.get_field('name'), new_field)
+ # One SQL statement is executed to alter the field.
+ self.assertEqual(len(logger_calls), 1)
+
+ @isolate_apps('schema')
@unittest.skipIf(connection.vendor == 'sqlite', 'SQLite remakes the table on field alteration.')
def test_unique_and_reverse_m2m(self):
"""