Django:如何为旧记录保留null值添加created_at字段?
解决PostgreSQL大表添加created_at字段旧记录保留null的问题
你遇到的问题是因为Django生成迁移时,哪怕设置了null=True,只要搭配auto_now_add=True,迁移文件里会自动给现有记录加上默认值(比如当前时间戳),导致旧记录也被填充了值。要实现旧记录为null、新记录自动赋值,得分两步操作:
第一步:先添加允许null的字段,不设置自动填充
修改模型字段为:created_at = models.DateTimeField(null=True)运行
python manage.py makemigrations,当提示"Enter a default value now"时直接按回车留空(不要设置任何默认值)。接着执行python manage.py migrate,这时候现有数百万条记录的created_at都会是null,而且因为没有全表更新默认值,迁移速度快,不会长时间锁表。第二步:修改字段启用auto_now_add
把字段改成:created_at = models.DateTimeField(auto_now_add=True, null=True)再次生成并执行迁移,这次迁移只会修改字段属性,不会改动现有记录的
null值,之后新插入的记录会自动填充当前时间到created_at字段。
如果后续想让新记录必须有值但保留旧记录的null,可以继续保留null=True;等业务允许时,也可以先通过数据迁移补全旧记录的created_at值,再去掉null=True约束。
内容的提问来源于stack exchange,提问作者Mostafa Mohamed
相关产品推荐
相关产品推荐

