【问题标题】:IntegrityError at /admin/api/user/6/change/ FOREIGN KEY constraint failed/admin/api/user/6/change/ FOREIGN KEY 约束的 IntegrityError 失败
【发布时间】:2022-11-22 04:58:07
【问题描述】:

我正在 django 上开发一个网站。当我尝试通过管理面板删除用户时出现错误。我可以改变例如员工状态(虽然仍然出现错误,但更改正在应用)代码如下:

模型.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"]

表单.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',)

管理员.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)

【问题讨论】:

  • 也许你有其他带有导致问题的field = models.ForeignKey(User, on_delete=CASCADE... 字段的模型。当你试图删除用户的所有对象时这个字段必须删除。
  • 问题是我没有这样的模型 XD

标签: python django


【解决方案1】:

可能的解决方案
有三件事可能导致问题,至少据我所知。第一个你已经打折了。我希望这是第二种解决方案,因为那样会更容易,但我担心它可能是第三种,这将是最难绕过的。

事业一
正如我的评论所述,也许有其他具有 User 的字段的模型作为 ForeignKeyon_delete = models.CASCADE。当您尝试删除 User 时,具有 ForeignKey 的此类的所有实例也将需要删除(因为 on_delete=models.CASCADE),这就是导致问题的原因。你已经说过你没有这样的模型,所以让我们继续解决方案 2。

原因二
我希望是这个,因为它可能更容易修复。我注意到您将 email = models.EmailField('email', unique=True) 作为您的用户模型的字段之一,但是 AbstractUser 应该已经有一个 email 字段。尝试删除该字段,进行迁移和迁移,然后查看问题是否已解决。

原因三
change from the default User model to the custom user you are now using in mid-project了吗?换句话说,在这个项目中,你有没有,曾经运行makemigrations你切换到自定义用户模型?这可能是个大问题。但是,有两种解决方案,不是那么容易或不可取,但可行。

解决方案一:如果这是一个还没有有价值数据的新项目,您可以简单地删除数据库,删除所有文件夹中的所有迁移,以及所有 __pycache__ 文件夹,如here 所述。然后重新做python manage.py makemigrationspython manage.py migrate。当然这会擦除你所有的桌子,所以你不想做这个中期项目。

解决方案B:有一种方法可以处理这个中期项目没有丢失数据。这些步骤在这个 django ticket 25313these 中,更具可读性。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2018-11-06
    • 1970-01-01
    • 2019-11-01
    相关资源
    最近更新 更多