所以问题是我现在有一个运行良好的Django项目。
我需要进行两次架构更改,A和B.
出于某种原因,我需要在应用迁移A后将一些fixture加载到数据库,然后应用迁移B.
当然,我可以手动完成。像:
./manage.py migrate my_app 0001
./manage.py loaddata my_fixture.json
./manage.py migrate my_app 0002
并且工作正常。
但是,在生产中,我想自动使用脚本部署我的项目。我不想在其中添加太多手动步骤。
我理想的解决方案是我可以在架构更改后自动填充我的夹具(可能有一些特殊的选项参数)。
有没有人知道该怎么做?
PS:我可能没有提供足够的问题信息。因此,如果您认为问题本身太模糊,请留下评论,让我看看我能做些什么来使其更清晰。
更新: 我已将Serafeim标记为正确答案。 RobertJørgensgaardEngdahl指出了一个很好的观点,可以在后面的帖子中详细解释 django loading data from fixture after backward migration / loaddata is using model schema not database schema
但是,我们遇到的问题并不完全相同。我的模式A是创建一个新表,并且在可预见的将来不会改变它。迁移B是向另一个表添加一个新列,指向由A创建的表。这就是为什么我需要在新表中预先填充一些数据(出于其他一些复杂的原因,我不想解释这个太多了)。我已经测试了Serafeim的解决方案,它的工作原理。
但是,如果有人遇到类似的情况,请查看RobertJørgensgaardEngdahl分享的帖子,了解此解决方案之前的缺点。再次感谢两位答复提供商!
答案 0 :(得分:0)
您应该使用南方数据迁移:
http://south.readthedocs.org/en/latest/tutorial/part3.html#data-migrations
South已经有一个用于在http://south.readthedocs.org/en/latest/fixtures.html中加载数据的收件人。
创建迁移0001后,创建一个空迁移,用于加载数据:
./manage.py datamigration appname load_myfixture
然后,在0002_load_myfixture.py迁移模块中修改forwards
迁移,如下所示:
def forwards(self, orm): from django.core.management import call_command call_command("loaddata", "my_fixture.json")
您无需实施backwards
迁移。
答案 1 :(得分:0)
在任何迁移中引入新行都应视为有害:无法“重置”迁移;即,在没有ORM更改的情况下发布,但所有迁移都替换为0001_initial迁移。在长期存在的项目中,您希望保持此选项处于打开状态。