Search code examples
djangoforeign-keysdatabase-migrationdjango-1.9

Django 1.9 drop foreign key in migration


I have a Django model that has a foreign key to another model:

class Example(models.Model)
   something = models.ForeignKey(SomeModel, db_index=True)

I want to keep the underlying DB column as a field, but to get rid of the foreign key constraint in the database.

So the model will change to:

class Example(models.Model):
   something_id = models.IntegerField() 

And, to be clear, something_id is the column that Django had created for the foreign key field.

I do not want to drop the column and re-create it (this is what Django does when I auto-generate migrations after changing the model as above).

I want to keep the field but I want to remove the foreign key constraint in the database with a migration. It's not clear to me how to do this with a Django migration - is there some built in support for it or do I have to run some raw SQL and, if so, how do I programatically get the name of the constraint?


Solution

  • This is how I managed to do it, it's based on nimasmi's answer above:

    class Migration(migrations.Migration):
        dependencies = [
            ('my_app', '0001_initial'),
        ]
    
        # These *WILL* impact the database!
        database_operations = [
            migrations.AlterField(
                model_name='Example',
                name='something',
                field=models.ForeignKey('Something', db_constraint=False, db_index=True, null=False)
            ),
        ]
    
        # These *WON'T* impact the database, they update Django state *ONLY*!
        state_operations = [
            migrations.AlterField(
                model_name='Example',
                name='something',
                field=models.IntegerField(db_index=True, null=False)
            ),
            migrations.RenameField(
                model_name='Example',
                old_name='something',
                new_name='something_id'
            ),
        ]
    
        operations = [
            migrations.SeparateDatabaseAndState(
                database_operations=database_operations,
                state_operations=state_operations
            )
        ]