仅更新models.Model中的特定字段

Reg*_*ser 76 django django-models django-views django-database

我有一个模特

class Survey(models.Model):
    created_by = models.ForeignKey(User)
    question = models.CharField(max_length=150)
    active = models.NullBooleanField()
    def __unicode__(self):
        return self.question
Run Code Online (Sandbox Code Playgroud)

现在我想只更新active字段.所以我这样做:

survey = get_object_or_404(Survey, created_by=request.user, pk=question_id)
survey.active = True
survey.save(["active"]) 
Run Code Online (Sandbox Code Playgroud)

现在我收到一个错误IntegrityError: PRIMARY KEY must be unique.

我是否正确使用此方法进行更新?

Ala*_*air 146

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

survey.save(update_fields=["active"]) 
Run Code Online (Sandbox Code Playgroud)

这个update_fields论点是在Django 1.5中添加的.在早期版本中,您可以使用该update()方法:

Survey.objects.filter(pk=survey.pk).update(active=True)
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个答案让 `.update()` 听起来已被弃用,但从 Django 4.0 开始,这两种更新方法仍然可用并且未被弃用。不过,提到这两个选项都是很好的答案:-) (4认同)
  • 这不会更新 `auto_now` 字段 `modified_at = models.DateTimeField(auto_now=True)` 必须指定如下 `survey.save(update_fields=["active", "modified_at"])` (2认同)

pem*_*ahl 15

通常,更新一个或多个模型实例中的某些字段的正确方法是update()在相应的查询集上使用该方法.然后你做这样的事情:

affected_surveys = Survey.objects.filter(
    # restrict your queryset by whatever fits you
    # ...
    ).update(active=True)
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢.我用`.get`代替`.filter`尝试了它,这不起作用.但是使用过滤器它很好用.你知道我的代码上面有什么问题吗? (2认同)
  • @RegisteredUser,看起来对象上没有"更新"方法,只是在查询集上.当您使用.filter()时,您将获得一个查询集(包含零个或多个对象).当您使用.get()时,您将获得一个对象. (2认同)