Default value for foreign key in Django migrations.AddField

eelioss picture eelioss · Mar 29, 2016 · Viewed 9.2k times · Source

Using migrations, I need to add a new field (a foreign key) to a model. I know it can be done with:

    migrations.AddField(
        model_name='MyModel',
        name='state',
        field=models.ForeignKey(null=True, related_name='mymodel_state', to='msqa_common.MyModelState'),
    ),

However, I don't want my field to be nullable. Instead, I want to use a default value for it, corresponding to the id of MyModelState whose name is "available" (id value might change in different machines). This "available" value of table MyModelState is inserted into the database in a previous migration script, so it does exist.

I guess I should do something like:

    migrations.AddField(
        model_name='MyModel',
        name='state',
        field=models.ForeignKey(null=False, default=available_state_id, related_name='mymodel_state', to='msqa_common.MyModelState'),
    ),

My question: How can I get the available_state_id within my migration script?

Answer

Daniel Roseman picture Daniel Roseman · Mar 29, 2016

You can't do it directly. The recommended way of doing this is to create a migration to add it with null=True, then add a data migration that uses either Python or SQL to update all the existing ones to point to available_state_id, then a third migration that changes it to null=False.