我正在进行迁移,将可空字段更改为不可空。新的__init__
例程通过执行一些自定义的健美操来确保字段不能为空,以提供合适的默认值。
问题在于是否必须迁移现有数据以应用默认的新规则,或者每当检索到旧对象时是否会自动应用这些规则?
Reading the source我怀疑ORM会恢复已保存数据的泡菜,因此我需要更新所有旧记录。但我需要另一双眼睛。
ORM在检索已保存的实例时是否调用init?
答案 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中每个字段的加载值。