让我们设想一个简化的Django项目:
<root>/lib/python2.7/site-packages/externalapp/shop
<root>/myapp
myapp
还通过添加几个字段扩展了externalapp.shop.models
模型。manage.py makemigrations
生成了名为0004_auto_20150410_2001.py的架构迁移文件:
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
# __init__ is added by me as an attempt how to tell django's
# migration loader operations are for the different application
def __init__(self, name, app_label):
super(Migration, self).__init__(name, 'shop')
dependencies = [
('myapp', '__first__'),
('shop', '0003_auto_20150408_0958'),
]
operations = [
migrations.AddField(
model_name='product',
name='vat',
field=models.ForeignKey(to='myapp.VAT', null=True),
),
]
如果默认情况下将上述迁移模式放置在<root>/lib/python2.7/site-packages/externalapp/shop/migrations/
路径中,manage.py migrate
将成功并正确添加表字段。
但是,如果我确实将上述迁移文件移到myapp/migrations/
中,则manage.py migrate
之后的操作将失败
django.core.management.base.CommandError:检测到冲突迁移(myapp中的0001_initial,0004_auto_20150410_2001)。 要修复它们,请运行“python manage.py makemigrations--merge”
错误消息我无法完全理解,建议makemigrations --merge
失败,预期为:
值错误:找不到集合的共同祖先([u'0001_initial',u'0004_auto_20150410_2001'])
我试图重写migrations.Migration.__init__
以更改派生的app_label
,但似乎迁移加载程序忽略了它。
如何调整迁移文件以便它可以从其他应用程序工作?
原因是在生产中externalapp
源不能直接接触,都是只读的。
要在Django项目周围移动迁移文件,例如在注入其他应用程序的模型时,需要确保在
django.db.migrations.Migration
子代中:django_migrations
的表中)我已经解决了迁移初始值设定项中的问题,它可能看起来像:
它确实对我有用,并且找到了足够的通用方法。
如果可能的话,渴望听到更好/更简单的解决方案。
自从Django 1.9以来,就有了
MIGRATION_MODULES
设置,您可以使用该设置将“外来”模型的迁移拉到您的应用程序中。如FeinCMS docs中所述,在应用程序中创建一个新包(包含
__init__.py
的文件夹),并在如下设置中列出外部应用程序:然后你就可以
manage.py makemigrations one other
等相关问题 更多 >
编程相关推荐