django 完整性错误位于/admin/api/user/6/change/ FOREIGN KEY约束失败

6pp0gazn  于 2022-11-26  发布在  Go
关注(0)|答案(1)|浏览(162)

我正在django上开发一个网站。当我试图通过管理面板删除一个用户时,我得到了一个错误。我可以更改例如员工状态(虽然仍然得到一个错误,但更改正在应用)代码如下:
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)

8yparm6h

8yparm6h1#

可能的解决方案

至少就我所知,有三件事 * 可能 * 导致了这个问题。第一件事你已经忽略了。我希望这是第二个解决方案,因为那会更容易,但我担心这可能是第三个,这将是最难绕过。
"原因一"
正如我的评论所说,也许有 * 另一个 * 模型的字段将User作为on_delete = models.CASCADEForeignKey。(因为on_delete=models.CASCADE),这就是导致问题的原因。您已经声明没有此类型号,因此让我们转到解决方案2。
"原因二"
我希望是这个,因为它可能更容易修复。我注意到您的用户模型中有一个字段email = models.EmailField('email', unique=True),但是AbstractUser应该已经有一个字段email。请尝试删除该字段,进行迁移并迁移,看看问题是否得到解决。
"原因三"
在项目中期,您是否从默认的User模型更改为您现在使用的自定义用户?换句话说,在这个项目中,您 * 是否 * 在切换到自定义用户模型之前运行过makemigrations?这可能是一个大问题。然而,有两种解决方案,不那么容易或理想,但可行。

  • 解决方案A:* 如果这是一个新项目,还没有任何有价值的数据,您可以简单地删除您的数据库,删除所有文件夹中的所有迁移,以及所有__pycache__文件夹(如here所述)。然后重新执行python manage.py makemigrationspython manage.py migrate。当然,这将擦除所有表,因此您不希望在项目中期执行此操作。
  • 解决方案B:* 有一种方法可以在不丢失数据的情况下处理这个中间项目。步骤在这个django ticket 25313,或these中,更可读的说明。

相关问题