django无法修复完整性错误

时间:2016-09-01 15:18:08

标签: python django null integrity

我决定从django中设置的数据库中删除一行字段。我已经在模型/表单中删除了它并完全重新运行了数据库(makemigrations,migrate)。但是,无论我做什么,我都会收到完整性错误(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)

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

你必须自己进入mysql控制台或任何mysql cilent来删除该列,而不是django migration。

如果您使用sqlite,遗憾的是,您无法在表格上删除列。 你可以在下面的链接上查看原因:

https://stackoverflow.com/a/8442173/4151886

您可以在以下链接中找到

和解决方案:

https://stackoverflow.com/a/5987838/4151886

答案 2 :(得分:0)

您可以运行虚假迁移。它会让你暂时传递错误。还要先尝试删除迁移,如果不起作用,请查看以下内容是否有效。

python manage.py makemigrations python manage.py migrate --fake