我决定从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)
答案 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
您可以在以下链接中找到和解决方案:
答案 2 :(得分:0)
您可以运行虚假迁移。它会让你暂时传递错误。还要先尝试删除迁移,如果不起作用,请查看以下内容是否有效。
python manage.py makemigrations python manage.py migrate --fake