Django 迁移引用已删除的模块
Django migrations reference a deleted module
我在 my_app/models/foo.py
.
中定义了一个名为 FooModel
的 Model
删除 foo.py
后,运行 Django (1.7) 迁移引发错误,因为旧的迁移文件导入 foo.py
(import myapp.models.foo.FooModel
).
我该如何解决?
当模型具有 ImageField
和 upload_to
参数时会发生这种情况。
有两种情况:
您已将 FooModel
移动到别处,然后编辑所有迁移文件以反映该移动。
您删除了 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/
我在 my_app/models/foo.py
.
FooModel
的 Model
删除 foo.py
后,运行 Django (1.7) 迁移引发错误,因为旧的迁移文件导入 foo.py
(import myapp.models.foo.FooModel
).
我该如何解决?
当模型具有 ImageField
和 upload_to
参数时会发生这种情况。
有两种情况:
您已将
FooModel
移动到别处,然后编辑所有迁移文件以反映该移动。您删除了
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/