Обновлять только определенные поля в моделях. Модель

У меня есть модель

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.

Я прав с этим методом для обновления?

Ответ 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() возвращает количество экземпляров опроса, на которые повлияло ваше обновление.