我应该编辑django迁移文件来编辑不匹配的依赖项

时间:2016-05-08 06:06:10

标签: python django django-migrations

我陷入了一个非常独特的问题。我创建了模型 1。'消息',使用了一段时间,然后我将其更改为 2。'消息'之后又将其改回 3。' message'但这次模型领域发生了很多变化。

随后我开始了解,django迁移在重命名模型时遇到了一些问题。在我的迁移中,出现了一些问题。虽然我以正确的方式运行了所有迁移,但在运行第3次迁移消息时,我遇到了一些我手动修复的问题。现在,当我为其他模型中的更改运行迁移时,我发现此迁移仍依赖于消息的第二次迁移。但是,它依赖于第二次迁移的字段实际上是在第三次迁移中创建的。

我得到的追溯:

ValueError: Lookup failed for model referenced by field activities.Enquiry.message_fk: chat.Message

  Applying contacts.0002_mailsend...Traceback (most recent call last):
  File "/home/sp/webapps/myenv/lib/python3.4/site-packages/django/apps/config.py", line 163, in get_model
    return self.models[model_name.lower()]
KeyError: 'message'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/sp/webapps/myenv/lib/python3.4/site-packages/django/db/migrations/state.py", line 84, in render
    model = self.apps.get_model(lookup_model[0], lookup_model[1])
  File "/home/sp/webapps/myenv/lib/python3.4/site-packages/django/apps/registry.py", line 202, in get_model
    return self.get_app_config(app_label).get_model(model_name.lower())
  File "/home/sp/webapps/myenv/lib/python3.4/site-packages/django/apps/config.py", line 166, in get_model
    "App '%s' doesn't have a '%s' model." % (self.label, model_name))
LookupError: App 'chat' doesn't have a 'message' model.

我想问的是,我是否应该手动编辑迁移文件中的依赖项,以便将其从迁移2更改为消息中的迁移3。

PS:使用django 1.7.2

3 个答案:

答案 0 :(得分:3)

通常,您不应手动编辑它们。

一旦你开始编辑它们,你将陷入循环依赖问题,如果你不记得你做了什么改变,你的整个迁移就会搞砸。

如果您没有丢失任何数据,您可以做的是还原迁移。如果要删除迁移,则应采取额外的预防措施,以确保在迁移表中没有任何条目仍然指向未进行的迁移。 (我建议不要手动删除迁移,因为它可能会变得复杂。)

如果您只分析了迁移文件,并清楚地知道问题发生在哪个位置,那么只有您应该考虑编辑迁移文件,但在您处理之前不要这样做。

在你的情况下,是的,问题可能是由于重命名而产生的,正如你所说的,在运行迁移时你遇到了一些你手动修复的问题,可能发生了这个过程会卡在它们之间并且它创建了一些问题。您可以更改依赖关系并运行makemigrations。如果存在循环依赖关系,它将直接出现,那么您应该恢复更改。或者,通过编辑更多文件,进行更多分析并删除循环依赖性问题。 (保持备份)如果你很幸运或者你深入了解迁移,你可能最终会成功。

答案 1 :(得分:1)

不,我不这么认为,最好在上次成功迁移后再删除迁移文件并再次运行。

答案 2 :(得分:0)

在完成不同公司的迁移管理流程后,如果您知道自己在做什么,我认为可以编辑迁移。实际上,在许多情况下,您必须编辑现有的迁移文件,甚至只是为了实现特定的更改而创建新文件。这里有几点需要注意:

  1. 了解并维护正在进行的操作顺序。
  2. 了解依赖关系
  3. 在推送到分期和制作之前测试它