django 无法修复完整性错误

django cannot fix integrity error

我决定从我在 Django 中设置的数据库的字段中删除一行。我已经在 models/form 中删除了它并完全重新 运行 数据库(makemigrations,迁移)。但是,无论我做什么,我都会不断收到完整性错误(NOT NULL 约束失败:index_user.email)。我不确定为什么会得到这个,因为该字段甚至不再存在,而且我无法在任何文件中找到它的任何踪迹。有人知道如何解决这个错误吗?

型号:

from django.db import models

# Create your models here.

class user(models.Model):
    username = models.CharField(max_length=20)
    password = models.CharField(max_length=15)

    def __str__(self):
        return self.username + ' - ' + self.password

观看次数:

def login(request):
    form = LoginForm(request.POST)
    if form.is_valid():
         username = form.cleaned_data["username"]
         password = form.cleaned_data["password"]
         user = authenticate(username=username, password=password)

         if user is not None:
            if user.is_active:
                login(request, user)
                return redirect('loggedin.html')
            else:
                return HttpResponse("Account deleted or disabled")
         else:
            return HttpResponseRedirect('/invalid')

    return render(request, "login_page.html", {'form': form})

形式:

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

def clean(self, *args, **kwargs):
    username = self.cleaned_data.get("username")
    password = self.cleaned_data.get("password")
    if username and password:
        user = authenticate(username=username, password=password)
        if not user:
            raise forms.ValidationError("User does not exist.")
        if not user.is_active:
            raise forms.ValidationError("User is no longer active.")
    return super(UserLoginForm, self).clean(*args, **kwargs)

如果您使用 Mysql 作为数据库后端,那么当您删除 django 模型中的任何字段时,即使您 运行 makemigrate 和 migrate,Mysql 仍然会 NOT 实际上删除数据库中的那个字段或列。

因此您认为已删除的列 index_user.email,应该仍在数据库中,这给了您错误。

您必须进入 mysql 控制台或任何 mysql 客户端才能自行删除该列,而不是通过 django 迁移。

不幸的是,如果您使用的是 sqlite,则无法在 table 上删除列。 您可以在下面的 link 中查看原因:

您可以在下面的 link 中找到解决方案:

您可以 运行 伪造迁移。它会让你暂时忽略错误。也请先尝试删除您的迁移,如果这不起作用,请查看以下是否有效。

python manage.py makemigrations python manage.py 迁移 --fake

我在不小心向后设置 ForeignKey 时使用的一个简单修复方法是使用 vs 代码文件跟踪并放弃所有更改。在执行此操作之前,您应该检查上次提交的时间。我在创建新模型之前就进行了提交,所以我只损失了大约 5 分钟的工作。