仅更新模型中的特定字段。


92

我有一个模特

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

我可以用这种方法更新吗?

Answers:


185

要更新字段的子集,可以使用update_fields

survey.save(update_fields=["active"]) 

update_fields参数是在Django 1.5中添加的。在早期版本中,可以改用以下update()方法:

Survey.objects.filter(pk=survey.pk).update(active=True)

17

通常,更新一个或多个模型实例中某些字段的正确方法是update()在相应的查询集上使用该方法。然后,您需要执行以下操作:

affected_surveys = Survey.objects.filter(
    # restrict your queryset by whatever fits you
    # ...
    ).update(active=True)

这样,您不再需要调用save()模型,因为它会自动保存。同样,该update()方法返回受您的更新影响的调查实例的数量。


2
谢谢。我尝试用.get代替,.filter这是行不通的。但是使用过滤器,效果很好。您知道上面的代码有什么问题吗?
注册用户

您的问题可能与question_id。这个价值从何而来?哪个确切的线提高了IntegrityError
pemistahl 2012年

question_id来自网址(?P<question_id>\d+)。我的错是在工作服务器上安装了django 1.4,我的代码是1.5。但是使用您的代码,它可以正常工作。
注册用户

2
@RegisteredUser,看起来对象上没有“更新”方法,只是查询集上没有。使用.filter()时,您将获得一个查询集(保留零个或多个对象)。使用.get()时,您将获得一个对象。
mgojohn 2014年

默认情况下,调用save()(@Alasdair解决方案)是一种更安全的解决方案,因为此方法可能会触发诸如验证或任何自定义代码之类的事情update()
David D.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.