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

创建Django模型触发django.db.utils.IntegrityError:NOT NULL约束失败

解决Django IntegrityError: NOT NULL constraint failed: new__blogapp_created_blog.user_id问题

错误原因

  1. 数据库表结构与当前模型不一致:你之前可能把user定义为ForeignKey(Django会自动生成user_id列并添加非空约束),后来改成CharField但没正确执行迁移,导致数据库里还保留着user_id的非空约束,创建数据时没给这个字段赋值就触发了错误。
  2. 创建created_blog实例时未给user字段传值:CharField默认要求非空,没传值会触发约束错误。

解决方案

方案1:规范模型并重新迁移(推荐)

如果user是关联系统用户,建议用ForeignKey关联Django自带的用户模型,同时修正字段类型的不合理之处:

from django.db import models
from django.contrib.auth.models import User

# 类名遵循PEP8大驼峰规范
class CreatedBlog(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    blog_title = models.CharField(max_length=100)
    blog_subtitle = models.TextField()  # 长文本用TextField,无需设置超大max_length
    date = models.DateTimeField(auto_now_add=True)  # 自动记录创建时间
    blog_content = models.TextField()  # 长内容用TextField

执行迁移命令更新数据库:

python manage.py makemigrations
python manage.py migrate

方案2:保留CharField的修复方式

  1. 创建实例时必须传入user字段的值:
CreatedBlog.objects.create(
    user="指定用户名",
    blog_title="测试标题",
    blog_subtitle="副标题内容",
    date="2024-05-20",
    blog_content="博客正文"
)
  1. 清理数据库遗留的user_id列:
    执行python manage.py makemigrations生成迁移文件,检查文件是否包含删除user_id列的操作,再执行python manage.py migrate完成更新。如果迁移未自动处理,可手动备份数据后在数据库中删除该列。

额外提示

  • 模型类名、字段名尽量遵循PEP8规范(类名大驼峰,字段名小蛇形),提升代码可读性。
  • 短文本用CharField,长文本内容优先用TextField,避免设置不切实际的超大max_length值。
  • 日期时间字段用DateTimeField,配合auto_now_add或auto_now参数自动维护,比手动存储字符串更可靠。

内容的提问来源于stack exchange,提问作者Raja.m

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:24:56