我刚刚学习了如何通过一次迁移来做到这一点!
当运行
makemigrationsdjango时,应要求你设置一个默认值。在这里定义所有可以使它满意的内容,最后将完成AddField你提到的迁移。
migrations.AddField( model_name='series', name='updated_as', field=models.DateTimeField(default=????, auto_now=True),),
将此操作更改为3个操作:
- 最初使该字段可为空,因此将添加该列。
- 调用一个函数以根据需要填充该字段。
- 更改字段(带有
AlterField
)以使其不可为空(如上述,没有默认设置)。
所以你最终得到类似的东西。
migrations.AddField( model_name='series', name='updated_as', field=models.DateTimeField(null=True, auto_now=True),),migrations.RunPython(set_my_defaults, reverse_func),migrations.AlterField( model_name='series', name='updated_as', field=models.DateTimeField(auto_now=True),),
你的函数定义为:
def set_my_defaults(apps, schema_editor): Series = apps.get_model('myapp', 'Series') for series in Series.objects.all().iterator(): series.updated_as = datetime.now() + timedelta(days=series.some_other_field) series.save()def reverse_func(apps, schema_editor): pass # pre for reverting migration, if any除了,你知道,并不可怕。考虑使用F表达式和/或数据库函数来提高大型数据库的迁移性能。



