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

Django后台删除用户触发FOREIGN KEY约束失败错误求助

Django Admin 删除用户触发外键约束错误,修改权限报错但生效问题

问题现象

  • 删除用户时,admin面板抛出错误:IntegrityError at /admin/api/user/6/change/ FOREIGN KEY constraint failed
  • 修改用户is_staff等权限状态时,同样弹出错误提示,但权限变更实际已生效

相关代码

models.py

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


class User(AbstractUser):
    emailSpam = models.BooleanField(default=True)
    email = models.EmailField('email', unique=True)

    first_name = None
    last_name = None

    confirmedEmail = models.BooleanField(default=False)

    REQUIRED_FIELDS = ["emailSpam"]

forms.py

from django.contrib.auth.forms import UserCreationForm, UserChangeForm

from .models import User


class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('email',)


class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = User
        fields = ('email',)

admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import User


class Admin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = User
    list_display = ('email', 'is_staff', 'is_active',)
    list_filter = ('email', 'is_staff', 'is_active',)
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Permissions', {'fields': ('is_staff', 'is_active')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2', 'is_staff', 'is_active')}
        ),
    )
    search_fields = ('email',)
    ordering = ('email',)


admin.site.register(User, Admin)

错误详情

错误核心信息:

IntegrityError: FOREIGN KEY constraint failed
请求路径: /admin/api/user/6/delete/
触发位置: Django SQLite数据库驱动执行删除SQL时触发约束校验

解决方法

1. 排查外键关联,配置on_delete规则

问题根源是数据库中存在其他表通过外键关联了自定义User模型,但这些外键未设置删除时的处理规则,导致删除用户时触发数据库外键约束。

找到所有关联User的模型,为外键字段添加on_delete参数:

  • 级联删除关联记录(删除用户时自动删除所有关联数据):
class YourModel(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='your_related_name')
  • 将关联字段设为NULL(需确保字段允许为空):
class YourModel(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='your_related_name')
  • 也可根据业务需求选择PROTECT(阻止删除用户)、SET_DEFAULT(设为默认值)等规则。

2. 执行数据库迁移

修改模型后,生成并应用迁移,让数据库更新约束规则:

python manage.py makemigrations
python manage.py migrate

3. 修改权限报错但生效的说明

修改权限时的错误同样源于未配置的外键约束,但权限变更操作本身已完成,后续触发的关联检查抛出了错误。解决外键on_delete配置后,该问题会同步消失。


内容的提问来源于stack exchange,提问作者Sanyokk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:20:33