Рамка сайтов 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
выше не работает для меня.