我正在开发一个Django应用程序,我遇到了一个关于2个南方并行迁移的奇怪问题。
一次迁移对应于新模型的创建(我们称之为'0001_add_model'),第二次迁移对应于向现有模型添加字段(我们称之为'0001_add_new_field_to_model')。现在,这两次迁移是在两个不同的分支中并行进行的(我不会再犯一个错误)。当我运行./manage.py migrate
时,南告诉我存在问题,并且我可以使用--merge
运行命令来运行迁移。鉴于这2个动作涉及不同的模型这一事实,我虽然应该没有问题,所以我做了,一切都正常。
当我从那时开始./manage.py schemamigration --auto
时出现了问题,它产生了一个与'add_model'完全相同的迁移,除了'add_field_to_model'中添加的字段。它看起来像这样:
( * ) 0001_auto__add_model
( * ) 0001_auto__add_new_field_to_model
-> ( ) 0002_auto__add_model
如果我以相反的方式执行此操作,则会生成相反的操作,即迁移以添加“add_field_to_model”中添加的字段。在这两种情况下,生成的新迁移显然都不适用,因为这些更改已存在于数据库中。
令我困惑的是它为什么会产生这样的迁移。南方的自动检测器如何工作以创建新的迁移?
我为了继续开发而做的是使用--fake
运行这种虚假迁移,但我认为最终的解决方案是重置迁移历史记录,这很麻烦,因为它在几个中被复制的环境中。
答案 0 :(得分:1)
问题来自于“冻结”模型表明前两次迁移之间不一致。如果查看迁移文件,您会看到Migration
类具有models
属性,这是生成迁移时模型的“冻结”表示。然后,South使用此表示(最后一个应用的迁移文件中的表示)来检测更改并生成新的迁移。由于您的两个“0001_XXX”迁移具有不同的“冻结”模型,因此将针对模型的错误表示生成任何新迁移。
显然,解决方案是手动修复“0001_XXX”迁移的models
。
而且,是的,South +并行分支可能是一种痛苦,但我无法看到South无论如何都可以做得更好。