Django Adding Default Data After Migrations
Django Adding default data After Migrations#
We are talking RunPython
here not fixtures.
Django Fixures are used to created initial data for models - however they are not automatically run as part of migrations.
Create an empty migration (remember to have already created the migrations for the table you are adding default data for)
./manage.py makemigrations <app_name> --empty -n <name_of_migration>
It will probably already have a dependency of the previous migration
Acquire the model with:
ModelName = apps.get_model("<app_name>", "<model_name>")
Then do actions on it much like in the docs:
from django.db import migrations
def forwards_func(apps, schema_editor):
# We get the model from the versioned app registry;
# if we directly import it, it'll be the wrong version
Country = apps.get_model("myapp", "Country")
db_alias = schema_editor.connection.alias
Country.objects.using(db_alias).bulk_create([
Country(name="USA", code="us"),
Country(name="France", code="fr"),
])
def reverse_func(apps, schema_editor):
# forwards_func() creates two Country instances,
# so reverse_func() should delete them.
Country = apps.get_model("myapp", "Country")
db_alias = schema_editor.connection.alias
Country.objects.using(db_alias).filter(name="USA", code="us").delete()
Country.objects.using(db_alias).filter(name="France", code="fr").delete()
class Migration(migrations.Migration):
dependencies = []
operations = [
migrations.RunPython(forwards_func, reverse_func),
]