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

Should i edit the django migration file to edit mismatched dependencies

我遇到了一个非常独特的问题。我创建了模型 1.'message',使用了一段时间,然后我将其更改为 2. 'messages'然后再次将其改回 3. 'message' 但这次在模型字段中进行了许多更改。

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

我得到的回溯:

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.

我想问的是是否需要手动编辑migration文件中的依赖,将messages中的migration 2改为migration 3

PS: 使用 django 1.7.2

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

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

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

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

只有你分析了迁移文件,清楚是什么位置出了问题,才想到编辑迁移文件,等你能处理好再做。

在你的情况下,是的,问题可能是由于重命名而产生的,正如你所说,在 运行 迁移时你遇到了一些你手动修复的问题,它可能发生在这个过程中被困在两者之间,它造成了一些问题。您可以更改依赖项和 运行 makemigrations。如果存在循环依赖,它会直接出现,那么你应该恢复更改。或者,只需多做一点分析并通过编辑更多文件来消除循环依赖问题。 (保持备份)如果你很幸运或者你对迁移有深入的了解,你可能最终会成功。

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

  1. 了解并维护正在执行的操作的顺序。
  2. 注意依赖关系
  3. 在推送到暂存和生产之前对其进行测试