根据创建django迁移时的django文档,我们应该使用apps.get_model()而不是导入模型并使用它们。
为什么数据迁移必须使用模型的历史版本而不是最新版本?(模型的历史版本不会正在使用吗?)
答案 0 :(得分:8)
它使用模型的历史版本,以便在您针对其他数据库运行迁移时,尝试访问代码库中可能不再存在的字段时不会遇到问题。
如果您从模型中删除了某个字段,然后想要在某个新数据库上运行迁移,而您直接导入模型,则可能会发现您的迁移会抱怨尝试使用不存在的字段。使用apps.get_model(...)
时,Django会尝试熟悉它并使用迁移文件中migrations.AddField(...)
的定义来为您提供正确的模型版本。
这也是Django在数据迁移中使用自定义模型/模型管理器方法时要小心的原因,因为我不相信他们可以从迁移历史中重新创建这些方法,或者行为可能随时间而变化您的迁移不会保持一致。
答案 1 :(得分:0)
考虑这个模型:
class A(models.Model):
field1 = models.PositiveIntegerField()
field2 = models.PositiveIntegerField()
您的迁移历史记录了解这两个字段,任何进一步的迁移都会考虑此模型状态,并会对此模型状态进行更改。
现在您假设删除字段1,您的模型变为:
class A(models.Model):
field2 = models.PositiveIntegerField()
在您的迁移中,您尝试使用field1,django应该知道field1已存在。因此,当我们使用apps.get_model()
时,它可以帮助django使用以前的迁移历史记录并推断出field1。其他,你会得到一个错误。
(编辑:修正答案中的拼写错误)