我有一个名为Model
的FooModel
在my_app/models/foo.py
中定义。
删除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模型,但这适用于迁移文件引用的任何类,函数或模块。
在自定义数据库迁移中,您不应直接导入模型,因为您将来可能会遇到此特定问题。相反,你应该使用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/