【问题标题】:django cannot fix integrity errordjango 无法修复完整性错误
【发布时间】:2016-09-01 15:18:07
【问题描述】:

我决定从我在 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)

【问题讨论】:

  • 如果您不向我们展示您的模型/表单是什么样子、您如何更改它们以及您的迁移是什么样子,几乎不可能知道出了什么问题。
  • 您是否打算修改网站管理部分预先打包的用户?
  • 我已经用模型/视图/表单更新了帖子。我遇到的问题是当我尝试通过管理功能将用户添加到数据库时,并不断收到完整性错误。
  • 当我在开发而不是在生产中时,处理此类错误的最佳方法是hack。我删除数据库并重建它。

标签: python django null integrity


【解决方案1】:

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

【讨论】:

  • 你应该如何使用vscode文件跟踪所以大家看到这个帖子就可以直接明白怎么做。顺便说一句,这是一个很好的答案,只是让它更有启发性。
【解决方案2】:

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

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

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

如果您使用的是 sqlite,很遗憾,您不能在表中删除列。 您可以在下面的链接中查看原因:

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

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

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

【讨论】:

  • 我正在使用 sqlite3(django 内置的数据库)知道如何删除该列吗?感谢您的回复!
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2015-06-17
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多