我有一个模型
class Survey(models.Model):
created_by = models.ForeignKey(User)
question = models.CharField(max_length=150)
active = models.NullBooleanField()
def __unicode__(self):
return self.question
现在我只想更新 active
字段。所以我这样做:
survey = get_object_or_404(Survey, created_by=request.user, pk=question_id)
survey.active = True
survey.save(["active"])
现在我收到错误 IntegrityError: PRIMARY KEY must be unique
。
我对这种方法进行更新是否正确?
要更新字段子集,您可以使用 update_fields
:
survey.save(update_fields=["active"])
update_fields
参数是在 Django 1.5 中添加的。在早期版本中,您可以改用 update()
方法:
Survey.objects.filter(pk=survey.pk).update(active=True)
通常,在一个或多个模型实例中更新某些字段的正确方法是在相应的查询集上使用 update()
方法。然后你做这样的事情:
affected_surveys = Survey.objects.filter(
# restrict your queryset by whatever fits you
# ...
).update(active=True)
这样,您就无需再对模型调用 save()
,因为它会自动保存。此外,update()
方法返回受您的更新影响的调查实例的数量。
.get
而不是 .filter
进行了尝试,但这不起作用。但是使用过滤器效果很好。你知道我上面的代码有什么问题吗?
question_id
有关。这个价值从何而来?哪一行确实提高了 IntegrityError
?
question_id
来自网址 (?P<question_id>\d+)
。我的错是在工作服务器上安装了 django 1.4,而我的代码是 1.5。但是使用您的代码,它工作正常。
save()
(@Alasdair 解决方案)是一种更安全的解决方案,因为与 update()
相比,此方法可能会触发验证或任何自定义代码之类的事情。
不定期副业成功案例分享
.update()
听起来不推荐使用,但从 Django 4.0 开始,这两种更新方法仍然可用且未弃用。不过,提到这两个选项的好答案:-)