You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:15:32