IntegrityError at /admin/api/user/6/change/ FOREIGN KEY constraint failed

Я разрабатываю сайт на 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)

Error message

Возможные решения
Есть три вещи, которые могут быть причиной проблемы, по крайней мере, насколько я могу судить. Первое вы уже отбросили. Я надеюсь, что это второе решение, поскольку это будет проще, но я боюсь, что это может быть третье, которое будет труднее всего обойти.

Причина одна
. Как говорилось в моем комментарии, возможно, существует другая модель с полем, которое имеет User как ForeignKey с on_delete = models.CASCADE. Когда вы попытаетесь удалить User, все экземпляры этого класса, которые имеют это ForeignKey, также должны быть удалены (из-за on_delete=models.CASCADE), и именно это вызывает проблему. Вы уже заявили, что у вас нет таких моделей, поэтому перейдем к решению 2.

Причина вторая
. Я надеюсь, что это она, так как ее легче исправить. Я заметил, что у вас есть email = models.EmailField('email', unique=True) как одно из полей для модели User, но AbstractUser уже должно иметь поле email. Попробуйте удалить это поле, выполнить makemigrations и migrate и посмотреть, решится ли проблема.

Причина третья
. Вы перешли от модели по умолчанию User к пользовательскому пользователю, которого вы сейчас используете, в середине проекта? Другими словами, выполняли ли вы в этом проекте когда-либо запуск makemigrations до того, как вы переключились на пользовательскую модель пользователя? Это может стать большой проблемой. Однако для этого есть два решения, не столь простых и желательных, но выполнимых.

Решение A: Если это новый проект, в котором еще нет ценных данных, вы можете просто удалить свою базу данных, удалить все миграции во всех папках, а также все папки __pycache__, как описано здесь. Затем повторите действия python manage.py makemigrations и python manage.py migrate. Конечно, это приведет к стиранию всех ваших таблиц, поэтому не стоит делать это в середине проекта.

Решение B: Есть способ справиться с этим в середине проекта безпотери данных. Шаги описаны в этом django ticket 25313, или these, более читабельные инструкции.

Удачи.

Вернуться на верх