Django Sites Framework: Initial Data Migration Location
A couple of tweaks to @Jason's answer. Last tested with Django 2.2.
from django.conf import settings
from django.db import migrations
def update_site_domain(apps, schema_editor):
Site = apps.get_model("sites", "Site")
s, _ = Site.objects.get_or_create(pk=settings.SITE_ID)
s.domain = settings.HOST
s.save()
class Migration(migrations.Migration):
dependencies = [
("your_app", "last_migration_name"),
("sites", "0002_alter_domain_unique"), # highest-numbered migration for the sites framework
]
operations = [migrations.RunPython(update_site_domain)]
You just need to reference the highest-numbered sites
migration as a dependency.
def forward(apps, schema_editor):
Site = apps.get_model("sites", "Site")
db_alias = schema_editor.connection.alias
s, created = Site.objects.using(db_alias).get_or_create(pk=1)
s.name = APP_NAME
s.domain = APP_NAME
s.save()
def reverse(apps, schema_editor):
Site = apps.get_model("sites", "Site")
db_alias = schema_editor.connection.alias
s = Site.objects.using(db_alias).get(pk=1)
s.name = ORIG_APP_NAME
s.domain = ORIG_APP_NAME
s.save()
class Migration(migrations.Migration):
dependencies = [
# `core` is the app containing this migration
('core', '0001_initial'),
# `0002_alter_domain_unique` is the highest-numbered migration for
# the sites framework
('sites', '0002_alter_domain_unique'),
]
operations = [
migrations.RunPython(forward, reverse)
]
This was tested on Django 1.11.2.
Fwiw, the MODULE_MIGRATIONS
solution above does not work for me.
First, configure MODULE_MIGRATIONS
in your django settings:
MIGRATION_MODULES = {
'sites': 'myproject.fixtures.sites_migrations',
}
Then, run ./manage.py makemigrations sites
to have django create the directory and create 0001_intitial.py
in the myproject.fixtures.sites_migrations
package.
Then, do ./manage.py makemigrations --empty sites
. The migration file should be created in the specified package.
My file 0002_initialize_sites.py
looks like this:
-*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
def insert_sites(apps, schema_editor):
"""Populate the sites model"""
Site = apps.get_model('sites', 'Site')
Site.objects.all().delete()
# Register SITE_ID = 1
Site.objects.create(domain='create.tourtodo.com', name='create')
# Register SITE_ID = 2
Site.objects.create(domain='www.tourtodo.com', name='www')
class Migration(migrations.Migration):
dependencies = [
('sites', '0001_initial'),
]
operations = [
migrations.RunPython(insert_sites)
]