Permalink
Browse files

Fixed #22460 -- Explicity remove constraints when dropping a related …

…field.
  • Loading branch information...
1 parent b5ce21a commit 0e45669fa9eb82c6de8e226c6da53ab5e88575f5 @motiejus motiejus committed with charettes Apr 16, 2014
Showing with 26 additions and 2 deletions.
  1. +10 −2 django/db/backends/schema.py
  2. +16 −0 tests/migrations/test_operations.py
@@ -442,8 +442,16 @@ def remove_field(self, model, field):
# 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),
@@ -416,6 +416,22 @@ def test_remove_field(self):
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.

0 comments on commit 0e45669

Please sign in to comment.