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

Does the ORM call init when retrieving a saved instance?

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

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

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

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

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

MyModel.objects.get(pk=1)
MyModel.objects.all()[2]
for p in MyModel.objects.all():
   print p.pk

然而,覆盖 __init__ 并不是控制模型加载行为的推荐方法。这应该用 from_db

来完成

The from_db() method can be used to customize model instance creation when loading from the database.

The db argument contains the database alias for the database the model is loaded from, field_names contains the names of all loaded fields, and values contains the loaded values for each field in field_names.