Django 迁移引用已删除的模块

Django migrations reference a deleted module

我在 my_app/models/foo.py.

中定义了一个名为 FooModelModel

删除 foo.py 后,运行 Django (1.7) 迁移引发错误,因为旧的迁移文件导入 foo.py (import myapp.models.foo.FooModel).

我该如何解决?

当模型具有 ImageFieldupload_to 参数时会发生这种情况。

有两种情况:

  1. 您已将 FooModel 移动到别处,然后编辑所有迁移文件以反映该移动。

  2. 您删除了 FooModel,在这种情况下,请按照下列步骤操作:

    • FooModel 放回原来的位置。
    • 确保您的代码中没有对 FooModel 的引用。
    • 运行 ./manage.py makemigrations my_app
    • 运行 ./manage.py squashmigrations my_app <migration created with the previous comand> — 有关压缩迁移的更多信息,请参阅 doc
    • 对在其迁移中引用 FooModel 的任何应用重复前两个步骤。
    • 确保一切正常后,删除 FooModel 和过时的迁移文件。

这应该可行,因为 FooModel 未被任何其他模型引用,因此在压缩它们时应将其从迁移文件中删除。

但是,请注意压缩迁移不是一个简单的操作,可能会产生后果,最好将模型保留在代码库中而不使用它。

注意:在这种情况下,所讨论的对象是 Django 模型,但这适用于迁移文件引用的任何 class、函数或模块。

在自定义数据库迁移中,您不应直接导入模型,因为您将来可能会遇到这个特殊问题。相反,您应该使用 Djangos get_model 函数。

MyModel = apps.get_model('myapp', 'MyModel')
for row in MyModel.objects.all():
    row.uuid = uuid.uuid4()
    row.save(update_fields=['uuid'])

在这种情况下,当您将来决定删除模型时,迁移也会 运行。

进一步阅读:https://docs.djangoproject.com/en/2.2/howto/writing-migrations/