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

Django报错:created_at列空值违反非空约束问题求助

嘿,这个报错我碰到过好多次了——核心问题就是你插入数据库的记录里,created_at字段是空的,但数据库里这个字段被设置成了不允许为NULL。我给你几个靠谱的解决思路,按顺序试就行:

1. 给模型字段加上自动填充创建时间的配置

这是最标准的做法,适合created_at用来记录数据创建时间的场景。修改你的模型,给created_at字段加上auto_now_add=True参数,Django会在你创建对象时自动把当前时间填进去,完全不用手动处理:

from django.db import models

class YourModel(models.Model):
    # 保留你原来的其他字段
    title = models.CharField(max_length=100)
    content = models.TextField()
    # 重点修改这行
    created_at = models.DateTimeField(auto_now_add=True)

改完之后,重新生成并应用迁移,让数据库同步这个配置:

python manage.py makemigrations
python manage.py migrate

小提醒:如果之前的迁移已经把created_at设为非空,这次修改后,新创建的所有记录都会自动带上created_at的值,不会再报这个错。

2. 给字段设置默认当前时间

如果你偶尔需要手动指定created_at的值,但大部分时候想用当前时间,可以用default参数替代auto_now_add:

from django.db import models
from django.utils.timezone import now  # 用Django的时区工具更规范

class YourModel(models.Model):
    # 其他字段...
    created_at = models.DateTimeField(default=now, null=False)

同样执行迁移命令更新数据库,之后插入记录时如果不传created_at,就会自动用当前时间填充。

3. 手动传值应急(临时测试用)

如果只是临时测试,或者有特殊场景需要指定特定时间,可以在创建对象时显式给created_at赋值:

from datetime import datetime
from your_app.models import YourModel

# 创建记录时手动传入时间
new_item = YourModel(
    title="测试标题",
    content="测试内容",
    created_at=datetime.now()
)
new_item.save()
额外排查点
  • 去migrations目录下看看最新的迁移文件,确认created_at字段的定义里有没有null=False(这是默认配置,一般都会有),以及是否包含正确的默认值或自动填充配置。
  • 如果是给已存在的旧表添加created_at字段,那得先给历史数据补全created_at的值,再设置非空约束,不然迁移的时候也会报错——不过你说已经完成模型迁移,应该是新表的问题,这条可以先忽略。

内容的提问来源于stack exchange,提问作者user9452835

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:06:33