Default value for foreign key in Django migrations.AddField Default value for foreign key in Django migrations.AddField django django

Default value for foreign key in Django migrations.AddField


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.


I just had the same issue and stumbled upon this answer, so here is how I did it:

  operations = [        # We are forced to create the field as non-nullable before        # assigning each Car to a Brand        migrations.AddField(            model_name="car",            name="brand",            field=models.ForeignKey(                null=True,                on_delete=django.db.models.deletion.PROTECT,                to="model.Brand",            ),        ),        # assign_car_to_brand loops over all my Car objects and sets their        # "brand" field        migrations.RunPython(add_category_to_tags, do_nothing),        # Make the field non-nullable to force all future Car to have a Brand        migrations.AlterField(            model_name="car",            name="brand",            field=models.ForeignKey(                null=False,                on_delete=django.db.models.deletion.PROTECT,                to="model.Brand",            ),            preserve_default=False        ),    ]