Fixed #22460 -- Explicity remove constraints when dropping a related field.

This commit is contained in:
Motiejus Jakštys 2014-04-16 16:55:34 +02:00 committed by Simon Charette
parent b5ce21accb
commit 0e45669fa9
2 changed files with 26 additions and 2 deletions

View File

@ -442,8 +442,16 @@ class BaseDatabaseSchemaEditor(object):
# It might not actually have a column behind it
if field.db_parameters(connection=self.connection)['type'] is None:
return
# Get the column's definition
definition, params = self.column_sql(model, field)
# Drop any FK constraints, MySQL requires explicit deletion
if field.rel:
fk_names = self._constraint_names(model, [field.column], foreign_key=True)
for fk_name in fk_names:
self.execute(
self.sql_delete_fk % {
"table": self.quote_name(model._meta.db_table),
"name": fk_name,
}
)
# Delete the column
sql = self.sql_delete_column % {
"table": self.quote_name(model._meta.db_table),

View File

@ -416,6 +416,22 @@ class OperationTests(MigrationTestBase):
operation.database_backwards("test_rmfl", editor, new_state, project_state)
self.assertColumnExists("test_rmfl_pony", "pink")
def test_remove_fk(self):
"""
Tests the RemoveField operation on a foreign key.
"""
project_state = self.set_up_test_model("test_rfk", related_model=True)
self.assertColumnExists("test_rfk_rider", "pony_id")
operation = migrations.RemoveField("Rider", "pony")
new_state = project_state.clone()
operation.state_forwards("test_rfk", new_state)
with connection.schema_editor() as editor:
operation.database_forwards("test_rfk", editor, project_state, new_state)
self.assertColumnNotExists("test_rfk_rider", "pony_id")
with connection.schema_editor() as editor:
operation.database_backwards("test_rfk", editor, new_state, project_state)
self.assertColumnExists("test_rfk_rider", "pony_id")
def test_alter_model_table(self):
"""
Tests the AlterModelTable operation.