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