web-dev-qa-db-fra.com

Mettre à jour uniquement des champs spécifiques dans un modèle.Modèle

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?

73
Registered User

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)
136
Alasdair

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.

16
pemistahl