Django迁移引用已删除的模块

时间:2015-04-30 10:32:33

标签: django migration django-migrations

我在Model中定义了名为FooModel的{​​{1}}。

删除my_app/models/foo.py后,运行Django(1.7)迁移会引发错误,因为旧的迁移文件导入foo.pyfoo.py)。

我该如何解决这个问题?

当模型的import myapp.models.foo.FooModel参数为ImageField时会发生这种情况。

2 个答案:

答案 0 :(得分:4)

有两种情况:

  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和陈旧的迁移文件。
  3. 这应该有效,因为当FooModel没有从任何其他模型引用时,应该在压缩它们时从迁移文件中删除它。

    但是,请注意,压缩迁移并不是一项简单的操作,可能会产生影响,因此在不使用模型的情况下将模型保留在代码库中可能更好。

    注意:在这种情况下,有问题的对象是Django模型,但这适用于迁移文件引用的任何类,函数或模块。

答案 1 :(得分:0)

在自定义数据库迁移中,您不应直接导入模型,因为将来您可能会遇到此特定问题。相反,您应该使用Django的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/