Django写入数据库,IntegrityError
Posted
技术标签:
【中文标题】Django写入数据库,IntegrityError【英文标题】:Django write to database, IntegrityError 【发布时间】:2013-07-25 23:31:34 【问题描述】:我的网页的 signup 视图(如下)通过 Django 的身份验证模型 User 创建了一个新用户,然后使用该新创建的用户 ID 通过我自己的模型添加更多信息, account.Users.我的问题是,虽然我将新用户的 ID 传递给第二个模型(account.Users 中的 ForeignKey 列),但我一直收到一个错误,即列 *user_id* 违反了非空约束:
IntegrityError at /account/signup/
null value in column "user_id" violates not-null constraint
这是我的模型的相关部分:
class Users(models.Model):
user = models.ForeignKey(User, unique=True, null=True, blank=True)
firstname = models.CharField(max_length=100, blank=True, default='')
以及我观点的相关部分:
def signup(request):
if request.method == 'POST' and request.POST['firstname']:
user = User.objects.create_user(request.POST['username'], request.POST['email'], request.POST['password'])
userId = user.id
form = UsersForm(request.POST, request.FILES)
if form.is_valid():
cmodel = form.save()
cmodel.user_id = userId
cmodel.firstname = request.POST['firstname']
cmodel.save()
这个错误的原因可能是什么?
除了设置 *cmodel.user_id* 等于 userId 之外,我还尝试将它设置为等于在第一步中创建的 user 对象,以及string 和 int(分别为“1”和 1)。我每次都得到同样的错误。我还尝试将字段更改为 cmodel.user。我还可以从 Django 的错误页面中看出,变量 userId 实际上包含一个值。
【问题讨论】:
另一条可能相关的信息:我还重新启动了 apache 和 postgres。 您是否在 Postrgres 中仔细检查了表的架构,也许您首先在没有null=True
的情况下创建了它,后来修复了它,但从未真正更新过架构。
它一直有 null=True
这种格式曾经可以工作,直到我更改了代码的其他一些部分,其中之一是安装 PIL(Python 图像库)并添加图像字段,这可能与它有关吗? (我不明白它怎么可能)......
不太可能,仍然 100% 肯定数据库中的架构允许 null。不仅仅依赖模型。
【参考方案1】:
解决方案很简单,尽管出乎意料。我把它写在这里以防其他人遇到同样的问题:
除了上面展示的模型的摘要部分之外,我还尝试使用PIL (Python Imaging Library) 保存图像。将其添加到上面显示的模型的相关部分:
class Users(models.Model):
user = models.ForeignKey(User, unique=True, null=True, blank=True)
firstname = models.CharField(max_length=100, blank=True, default='')
profile_pic = models.ImageField(upload_to='profilepics', max_length=300, default='')
这个“upload_to”文件夹“profilepics”具有访问权限“755”,但是当我通过在终端中运行“$ chmod -R 777 profilepics”来更改它们时,一切正常!奇怪的是,错误消息将其归咎于我的“user_id”字段为空。这实际上只是完全不同的东西的文件夹权限。希望有一天能对某人有所帮助。
【讨论】:
以上是关于Django写入数据库,IntegrityError的主要内容,如果未能解决你的问题,请参考以下文章
Django 登录错误:在 IIS 中“尝试写入只读数据库”