Loading django/db/backends/schema.py +10 −2 Original line number Diff line number Diff line Loading @@ -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), Loading tests/migrations/test_operations.py +16 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading
django/db/backends/schema.py +10 −2 Original line number Diff line number Diff line Loading @@ -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), Loading
tests/migrations/test_operations.py +16 −0 Original line number Diff line number Diff line Loading @@ -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. Loading