【问题标题】:Django migrations reference a deleted moduleDjango 迁移引用了一个已删除的模块
【发布时间】:2015-07-10 00:25:02
【问题描述】:

我在my_app/models/foo.py 中定义了一个名为FooModelModel

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

我应该如何解决这个问题?

当模型的 ImageField 带有 upload_to 参数时,会发生这种情况。

【问题讨论】:

  • 你删除了FooModel 还是移动了它?
  • 有时候我删了,这次我搬了。

标签: django migration django-migrations


【解决方案1】:

有两种情况:

  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 模型,但这适用于迁移文件引用的任何类、函数或模块。

【讨论】:

  • 谢谢!希望有一个简单的解决方案。但也很高兴知道目前可用的最佳选择。
  • 哇,谢谢!我不知道你可以压制迁移。在我的情况下,它甚至更简单,只需压缩迁移引用已删除模型的应用程序就可以了。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-22
    • 2016-10-02
    • 2015-03-12
    • 2013-09-15
    • 1970-01-01
    • 2020-07-30
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多