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)
Возможные решения
Есть три вещи, которые могут быть причиной проблемы, по крайней мере, насколько я могу судить. Первое вы уже отбросили. Я надеюсь, что это второе решение, поскольку это будет проще, но я боюсь, что это может быть третье, которое будет труднее всего обойти.
Причина одна
.
Как говорилось в моем комментарии, возможно, существует другая модель с полем, которое имеет 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, более читабельные инструкции.
Удачи.