Django South Schema迁移与夹具预加载

时间:2014-04-29 19:16:39

标签: python django django-south

所以问题是我现在有一个运行良好的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分享的帖子,了解此解决方案之前的缺点。再次感谢两位答复提供商!

2 个答案:

答案 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迁移。在长期存在的项目中,您希望保持此选项处于打开状态。