【问题标题】:Update only specific fields in a models.Model仅更新 models.Model 中的特定字段
【发布时间】:2012-12-03 18:52:32
【问题描述】:

我有模特

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

我用这种方法更新是否正确?

【问题讨论】:

    标签: django django-models django-views django-database


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      通常,在一个或多个模型实例中更新某些字段的正确方法是在相应的查询集上使用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。但是使用您的代码,它工作正常。
      • @RegisteredUser,看起来对象上没有“更新”方法,只是在查询集上。当你使用 .filter() 时,你会得到一个查询集(保存零个或多个对象)。当您使用 .get() 时,您会得到一个对象。
      • 默认情况下,调用save()(@Alasdair 解决方案)是一种更安全的解决方案,因为与update() 相比,此方法可能会触发验证或任何自定义代码。
      猜你喜欢
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多