为什么在创建数据迁移时使用apps.get_model()?

时间:2016-06-11 15:16:55

标签: django-models django-migrations

根据创建django迁移时的django文档,我们应该使用apps.get_model()而不是导入模型并使用它们。

为什么数据迁移必须使用模型的历史版本而不是最新版本?(模型的历史版本不会正在使用吗?)

2 个答案:

答案 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。其他,你会得到一个错误。

(编辑:修正答案中的拼写错误)

相关问题