J'ai un modèle
class Survey(models.Model):
created_by = models.ForeignKey(User)
question = models.CharField(max_length=150)
active = models.NullBooleanField()
def __unicode__(self):
return self.question
et maintenant je veux mettre à jour uniquement le champ active
. Alors je fais ça:
survey = get_object_or_404(Survey, created_by=request.user, pk=question_id)
survey.active = True
survey.save(["active"])
Maintenant, je reçois une erreur IntegrityError: PRIMARY KEY must be unique
.
Ai-je raison de mettre à jour cette méthode?
Pour mettre à jour un sous-ensemble de champs, vous pouvez utiliser update_fields
:
survey.save(update_fields=["active"])
L'argument update_fields
A été ajouté dans Django 1.5. Dans les versions antérieures, vous pouviez utiliser la méthode update()
:
Survey.objects.filter(pk=survey.pk).update(active=True)
Généralement, la méthode correcte de mise à jour de certains champs dans une ou plusieurs instances de modèle consiste à utiliser la méthode update()
sur le jeu de requêtes respectif. Ensuite, vous faites quelque chose comme ça:
affected_surveys = Survey.objects.filter(
# restrict your queryset by whatever fits you
# ...
).update(active=True)
Ainsi, vous n'avez plus besoin d'appeler save()
sur votre modèle, car celui-ci est enregistré automatiquement. De plus, la méthode update()
renvoie le nombre d'instances d'enquête affectées par votre mise à jour.