Django Admin报错“外键冲突”排查

文章讲述了在使用Django时,遇到后台管理界面添加条目时因外键冲突而失败的问题。问题源于自定义用户模型的id类型与auth_user表不匹配,通过调整django_admin_log表的user_id类型解决了冲突。同时,还提到了Django_admin_log表默认没有设置主键自增的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:在后台管理界面添加条目时,报外键冲突导致添加失败。

django.db.utils.IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`blog`.`django_admin_log`, CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`))')

auth_user 表: 新的超级用户条目将被添加到该表中,包含用户名、哈希密码、电子邮件等。

django_admin_log 表: 在某些情况下,Django Admin 会记录管理员操作。如果 createsuperuser 命令使用 Django Admin 的某些组件,则可能会创建日志记录。

当继承自 AbstractUser,并自定义一些字段(如 mobile),Django 将根据这个自定义模型来创建和管理用户。自定义用户模型对应于 tb_user 表,而不是默认的 auth_user 表。因此,执行 createsuperuser 时,数据会写入 tb_user ,当然前提是 AUTH_USER_MODEL 配置正确。

查找原因

查了django_admin_log表,其FOREIGN KEY (user_id)是依赖于auth_user表的id:

mysql> SHOW CREATE TABLE django_admin_log;

| django_admin_log | CREATE TABLE `django_admin_log` (
  `id` int NOT NULL AUTO_INCREMENT,
  `action_time` datetime(6) NOT NULL,
  `object_id` longtext,
  `object_repr` varchar(200) NOT NULL,
  `action_flag` smallint unsigned NOT NULL,
  `change_message` longtext NOT NULL,
  `content_type_id` int DEFAULT NULL,
  `user_id` int NOT NULL,
  PRIMARY KEY (`id`),
  KEY `django_admin_log_content_type_id_c4bce8eb_fk_django_co` (`content_type_id`),
  KEY `django_admin_log_user_id_c564eba6_fk_auth_user_id` (`user_id`),
  CONSTRAINT `django_admin_log_content_type_id_c4bce8eb_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`),
  CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
  CONSTRAINT `django_admin_log_chk_1` CHECK ((
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一生要强的Zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值