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

use*_*666 4 django-models django-migrations

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

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

A. *_*arr 10

它使用模型的历史版本,以便在您对另一个数据库运行迁移时尝试访问代码库中可能不再存在的字段时不会出现问题.

如果您从模型中删除了某些字段,然后想要在某个新数据库上运行迁移,并且您直接导入模型,则可能会发现您的迁移会尝试使用不存在的字段.使用apps.get_model(...)Django时,会尝试对其进行智能操作,并使用migrations.AddField(...)迁移文件中的定义在该时间点为您提供正确的模型版本.

这也是Django在数据迁移中使用自定义模型/模型管理器方法时要小心的原因,因为我不相信他们可以从迁移历史记录中重新创建这些方法,或者行为可能会随着时间的推移而发生变化,而且迁移也不会始终如一.

  • Django 可能正在谈论 6 个月前编写的数据迁移,当时模型完全不同,但该数据迁移现在仍然需要像 6 个月前一样工作。它不应该抱怨当前模型中缺少某个字段,因为数据迁移不是为当前模型设计的,而是为模型的特定版本设计的。 (3认同)