在检索已保存的实例时,ORM是否调用init?

时间:2016-05-12 01:19:07

标签: django django-models django-orm

我正在进行迁移,将可空字段更改为不可空。新的__init__例程通过执行一些自定义的健美操来确保字段不能为空,以提供合适的默认值。

问题在于是否必须迁移现有数据以应用默认的新规则,或者每当检索到旧对象时是否会自动应用这些规则?

Reading the source我怀疑ORM会恢复已保存数据的泡菜,因此我需要更新所有旧记录。但我需要另一双眼睛。

ORM在检索已保存的实例时是否调用init?

1 个答案:

答案 0 :(得分:1)

当django创建模型实例时,是否会在模型上调用C++?简短的回答是肯定的。如果您使用get或切片查询集或遍历它,将调用__init__

__init__

然而,覆盖MyModel.objects.get(pk=1) MyModel.objects.all()[2] for p in MyModel.objects.all(): print p.pk 并不是推荐的控制模型加载行为的方法。这应该用from_db

完成
  

from_db()方法可用于自定义模型实例创建   从数据库加载时。

     

db参数包含数据库模型的数据库别名   加载自,field_names包含所有加载字段的名称,   和values包含field_names中每个字段的加载值。