我在我的Django模型中添加了一个新的不可空字段,并试图使用迁移来部署该更改。我如何将现有模型的默认值设置为这些模型的某个函数而不是常量?
举个例子,假设我之前有一个created_on
字段,我刚刚添加了一个updated_on
字段,我想将其值初始化为模型的created_on
。
这就是我试图开始的:
migrations.AddField(
model_name='series',
name='updated_as',
field=models.DateTimeField(default=????, auto_now=True),
preserve_default=False,
),
字符串
4条答案
按热度按时间5m1hhzi41#
我刚刚学会了如何通过一次迁移来实现这一点!
当运行
makemigrations
时,django会要求你设置一个一次性的默认值。在这里定义你能做的一切来保持它的快乐,你最终会得到你提到的AddField
迁移。字符串
将这一个操作改为3个操作:
1.最初使字段可为空,因此将添加列。
1.根据需要调用函数来填充字段。
1.改变字段(使用
AlterField
)使其不可为空(与上面一样,没有默认值)。最后你会得到这样的结果:
型
你的函数定义如下:
型
不过,也不算太糟。
注意:考虑使用F expressions和/或database functions来提高大型数据库的迁移性能。
rekjcdws2#
您需要分两次迁移。首先,添加您的字段,但使其可为空。像往常一样创建一个迁移文件。之后,将您的字段设置为不可为空并再次运行makemigrations,但不要启动migrate。打开第二次迁移并在顶部定义一个函数:
字符串
然后,在您的迁移文件中有一个操作列表。在alter field操作之前添加
型
它应该能做到
vm0i2vca3#
你还应该为你的函数
set_my_defaults()
定义一个反向,以防将来你需要恢复迁移。字符串
在这种情况下,反向函数不需要做任何事情,因为您正在删除字段。
并将其添加到RunPython:
型
jc3wubiy4#
要将从现有字段中获取的默认值添加到新的不可为空的字段中,请按以下方式编写迁移:
null=True
添加到生成的AddField
语句中RunSQL
语句,根据表中所有记录的现有字段填充新字段AlterField
语句再次删除null=True
字符串