Рамка сайтов Django: начальное местоположение миграции данных

Прежде чем Django 1.7 при использовании Django Sites Framework можно/должно определить исходные данные, используя Initial Fixtures.

MyProject/приборы/initial_data.json

[
{
    "pk": 1, 
    "model": "sites.site", 
    "fields": {
        "domain": "domain1", 
        "name": "name1"
    }
},
{
    "pk": 2, 
    "model": "sites.site", 
    "fields": {
        "domain": "domain2", 
        "name": "name2"
    }
},
{
    "pk": 3, 
    "model": "sites.site", 
    "fields": {
        "domain": "domain3", 
        "name": "name3"
    }
}
]

Поскольку это глобальная настройка проекта, я добавил папку "привязки" к корню проекта и добавила ее в FIXTURE_DIRS.

# Used to search fixture files directories.
# Fixture files are files that provide initial data to be
# inserted in the database. (>python manage.py loaddata)

    FIXTURE_DIRS = [
        os.path.join(PROJECT_ROOT, "fixtures"),
    ]

Теперь я использую Django 1.7, и рекомендуется использовать миграции. Цитирование документации Django:

Чтобы установить правильное имя и домен для вашего проекта, вы можете использовать миграцию данных.

Проблема Миграции зависят от приложения:

python manage.py makemigrations --empty yourappname

Итак, каков рекомендуемый подход для добавления информации о сайте в мой проект с использованием миграции данных? Где должна жить эта миграция?

Запуск python manage.py makemigrations --empty sites создает миграцию в папке стороннего приложения, поэтому мы этого не хотим.

Нельзя ли определить MIGRATION_DIRS как FIXTURE_DIRS для начальных_данных?

Я нашел MIGRATION_MODULES в документации по настройкам, но проблема все еще остается, она специфична для приложения.

Ответ 1

Сначала настройте MODULE_MIGRATIONS в настройках django:

MIGRATION_MODULES = {
    'sites': 'myproject.fixtures.sites_migrations',
}

Затем запустите ./manage.py makemigrations sites, чтобы создать django каталог и создать 0001_intitial.py в пакете myproject.fixtures.sites_migrations.

Тогда do ./manage.py makemigrations --empty sites. Файл миграции должен быть создан в указанном пакете.

Мой файл 0002_initialize_sites.py выглядит следующим образом:

-*- 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)
    ]

Ответ 2

Вам просто нужно указать ссылку с наивысшим номером sites как зависимость.

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)
    ]

Это было протестировано на Django 1.11.2.

Fwiw, решение MODULE_MIGRATIONS выше не работает для меня.