创建Django模型触发django.db.utils.IntegrityError:NOT NULL约束失败
解决Django IntegrityError: NOT NULL constraint failed: new__blogapp_created_blog.user_id问题
错误原因
- 数据库表结构与当前模型不一致:你之前可能把
user定义为ForeignKey(Django会自动生成user_id列并添加非空约束),后来改成CharField但没正确执行迁移,导致数据库里还保留着user_id的非空约束,创建数据时没给这个字段赋值就触发了错误。 - 创建
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的修复方式
- 创建实例时必须传入
user字段的值:
CreatedBlog.objects.create( user="指定用户名", blog_title="测试标题", blog_subtitle="副标题内容", date="2024-05-20", blog_content="博客正文" )
- 清理数据库遗留的
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
相关产品推荐
相关产品推荐

