JCJ*_*CJS 14 django-sites django-fixtures django-migrations
在Django 1.7之前,当使用Django Sites Framework时,可以/应该使用Initial Fixtures定义初始数据.
的myproject /装置/ initial_data.json
Run Code Online (Sandbox Code Playgroud)[ { "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" } } ]
由于它是一个全局项目设置,我在项目根目录中添加了一个"fixtures"文件夹,并将其添加到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"),
]
Run Code Online (Sandbox Code Playgroud)
现在,我正在使用Django 1.7,建议使用迁移.引用Django文档:
要为项目设置正确的名称和域,可以使用数据迁移.
问题是迁移是特定于应用程序的:
python manage.py makemigrations --empty yourappname
那么,使用数据迁移将站点信息添加到项目的建议方法是什么?迁移应该在哪里生活?
运行python manage.py makemigrations --empty sites会在第三方应用程序文件夹中创建迁移,因此我们不希望这样.
不应该为initial_data定义MIGRATION_DIRS,因为FIXTURE_DIRS存在?
我在设置文档中找到了MIGRATION_MODULES,但问题仍然存在,它是特定于应用程序的.
Tho*_*ers 13
首先,MODULE_MIGRATIONS在django设置中进行配置:
MIGRATION_MODULES = {
'sites': 'myproject.fixtures.sites_migrations',
}
Run Code Online (Sandbox Code Playgroud)
然后,运行./manage.py makemigrations sites让django创建目录并0001_intitial.py在myproject.fixtures.sites_migrations包中创建.
然后,做./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)
]
Run Code Online (Sandbox Code Playgroud)
您只需要引用编号最高的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)
]
Run Code Online (Sandbox Code Playgroud)
这是在 Django 1.11.2 上测试过的。
Fwiw,MODULE_MIGRATIONS上面的解决方案对我不起作用。
| 归档时间: |
|
| 查看次数: |
3096 次 |
| 最近记录: |