Django迁移引用已删除的模块

问题描述 投票:6回答:2

我有一个名为ModelFooModelmy_app/models/foo.py中定义。

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

我该如何解决这个问题?

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

django migration django-migrations
2个回答
5
投票

有两种情况:

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.