为什么在创建数据迁移时使用 apps.get_model()?
Why use apps.get_model() when creating a data migration?
根据 django 文档,在创建 django 迁移时,我们应该使用 apps.get_model() 而不是导入模型并使用它们。
为什么数据迁移必须使用模型的历史版本而不是最新版本?(模型的历史版本无论如何都不会被使用吧?)
它使用模型的历史版本,因此当您 运行 迁移到另一个数据库时,它不会在尝试访问代码库中可能不再存在的字段时遇到问题。
如果您从模型中删除了一些字段,然后想 运行 在一些新数据库上进行迁移,并且您正在直接导入模型,那么您可以预期迁移会抱怨尝试使用一个字段不存在。当使用 apps.get_model(...)
时,Django 会尝试变得聪明,并使用迁移文件中 migrations.AddField(...)
的定义来及时为您提供模型的正确版本。
这也是 Django 说在数据迁移中使用自定义 Model/Model 管理器方法时要小心的原因,因为我不相信它们可以从迁移历史中重新创建这些方法,或者行为可以改变时间和您的迁移将不一致。
考虑这个模型:
class A(models.Model):
field1 = models.PositiveIntegerField()
field2 = models.PositiveIntegerField()
您的迁移历史知道这两个字段,任何进一步的迁移都将考虑此模型状态并将更改此模型状态。
现在假设,您删除 field1 并且您的模型变为:
class A(models.Model):
field2 = models.PositiveIntegerField()
并且在迁移中,你尝试使用field1,django应该知道field1存在。因此,当我们使用 apps.get_model()
时,它有助于 django 使用以前的迁移历史并推断 field1。否则会报错。
根据 django 文档,在创建 django 迁移时,我们应该使用 apps.get_model() 而不是导入模型并使用它们。
为什么数据迁移必须使用模型的历史版本而不是最新版本?(模型的历史版本无论如何都不会被使用吧?)
它使用模型的历史版本,因此当您 运行 迁移到另一个数据库时,它不会在尝试访问代码库中可能不再存在的字段时遇到问题。
如果您从模型中删除了一些字段,然后想 运行 在一些新数据库上进行迁移,并且您正在直接导入模型,那么您可以预期迁移会抱怨尝试使用一个字段不存在。当使用 apps.get_model(...)
时,Django 会尝试变得聪明,并使用迁移文件中 migrations.AddField(...)
的定义来及时为您提供模型的正确版本。
这也是 Django 说在数据迁移中使用自定义 Model/Model 管理器方法时要小心的原因,因为我不相信它们可以从迁移历史中重新创建这些方法,或者行为可以改变时间和您的迁移将不一致。
考虑这个模型:
class A(models.Model):
field1 = models.PositiveIntegerField()
field2 = models.PositiveIntegerField()
您的迁移历史知道这两个字段,任何进一步的迁移都将考虑此模型状态并将更改此模型状态。
现在假设,您删除 field1 并且您的模型变为:
class A(models.Model):
field2 = models.PositiveIntegerField()
并且在迁移中,你尝试使用field1,django应该知道field1存在。因此,当我们使用 apps.get_model()
时,它有助于 django 使用以前的迁移历史并推断 field1。否则会报错。