Django迁移报错:django.db.utils.IntegrityError(1215,无法添加外键约束)
解决Django迁移时MySQL外键约束错误(1215)
遇到django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')错误,结合你提供的代码,核心原因和解决方法如下:
核心问题:AuthUser模型缺失显式主键定义
你通过inspectdb生成的AuthUser模型没有显式声明主键字段,但Django默认的auth_user表主键是id(自增整数)。当managed=False时,Django不会自动推断表的主键,导致外键关联时无法找到正确的关联字段。
解决步骤1:修正AuthUser模型
在AuthUser类中添加主键字段,匹配原auth_user表的结构:
class AuthUser(models.Model): id = models.AutoField(primary_key=True) # 新增:显式定义主键 password = models.CharField(max_length=128) last_login = models.DateTimeField(blank=True, null=True) is_superuser = models.IntegerField() username = models.CharField(unique=True, max_length=150) first_name = models.CharField(max_length=150) last_name = models.CharField(max_length=150) email = models.CharField(max_length=254) is_staff = models.IntegerField() is_active = models.IntegerField() date_joined = models.DateTimeField() class Meta: managed = False db_table = 'auth_user'
其他可能的排查点
如果修正主键后仍然报错,检查以下内容:
1. 数据库引擎一致性
MySQL的MyISAM引擎不支持外键约束,必须确保auth_user和user_details表都使用InnoDB引擎:
- 查看表引擎:
SHOW CREATE TABLE auth_user; - 修改引擎(如果需要):
ALTER TABLE auth_user ENGINE=InnoDB;
Django默认会使用InnoDB,可在settings.py中添加配置确保:
DATABASES = { 'default': { # 其他配置... 'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES', innodb_strict_mode=1", }, } }
2. 字符集与排序规则一致
两个表的字符集和排序规则必须完全匹配,否则MySQL会拒绝创建外键:
- 查看表字符集:
SHOW FULL COLUMNS FROM auth_user; - 统一字符集(推荐使用utf8mb4):
ALTER TABLE auth_user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE user_details CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. 字段类型匹配
确保外键关联的字段类型完全一致:AuthUser的主键是AutoField(对应MySQL的int(11)),UserDetails的user_id字段会自动匹配类型,无需额外修改,但如果原表字段类型有差异,需要同步调整模型定义。
验证修复
修改后重新运行迁移命令:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者marivic valdehueza
相关产品推荐
相关产品推荐

