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

Django创建Tutorial遇主键唯一约束冲突,但对象可正常生成

解决Tutorial创建时的UNIQUE constraint failed: main_tutorial.id错误

问题分析

通过表单创建Tutorial对象时,对象能正常生成并显示,但触发IntegrityError提示主键id的唯一约束冲突。即便删除数据库、回滚迁移后问题仍存在,报错指向Tutorial.objects.create(...)行。结合SQLite特性和Django ORM机制,以下是针对性修复方案:

修复步骤

1. 重置SQLite的自增序列

SQLite通过sqlite_sequence表记录各表的自增主键当前值,即便重建数据库,若迁移未正确初始化该表,可能导致新对象尝试使用已存在的id值:

  • 打开终端进入项目目录,执行命令打开SQLite数据库:
    sqlite3 db.sqlite3
    
  • 在SQLite命令行中执行:
    -- 查看Tutorial表的自增序列记录
    SELECT * FROM sqlite_sequence WHERE name='main_tutorial';
    -- 删除该记录,让Django重新生成序列
    DELETE FROM sqlite_sequence WHERE name='main_tutorial';
    
  • 输入.exit退出SQLite,重新执行迁移:
    python manage.py makemigrations && python manage.py migrate
    

2. 检查表单是否意外传递id参数

确认前端add-tutorial.html表单中没有残留的name="id"字段(比如旧的隐藏输入框),避免POST请求时将id值传入create方法。同时检查视图代码中Tutorial.objects.create()的参数,确保没有手动传入id。

3. 清理残留的迁移文件

回滚迁移后可能有旧迁移文件残留,导致数据库结构异常:

  • 删除对应应用(main)下migrations目录中除__init__.py外的所有文件。
  • 删除数据库文件db.sqlite3。
  • 重新生成并执行迁移:
    python manage.py makemigrations
    python manage.py migrate
    

4. 清除Django ORM缓存

之前手动指定id的操作可能让ORM缓存了旧的主键配置,重启Django开发服务器即可清除缓存,确保ORM使用默认的自增主键逻辑。


内容的提问来源于stack exchange,提问作者F.13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:22:43