118 votes

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

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 seulement le active champ. Alors je fais ça :

survey = get_object_or_404(Survey, created_by=request.user, pk=question_id)
survey.active = True
survey.save(["active"]) 

Maintenant, j'obtiens une erreur IntegrityError: PRIMARY KEY must be unique .

Ai-je raison avec cette méthode de mise à jour ?

236voto

Alasdair Points 36535

Pour mettre à jour un sous-ensemble de champs, vous pouvez utiliser update_fields :

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

El update_fields a été ajouté dans Django 1.5. Dans les versions précédentes, vous pouviez utiliser l'argument update() à la place :

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

21voto

pemistahl Points 2413

En général, la manière correcte de mettre à jour certains champs dans une ou plusieurs instances de modèle est d'utiliser la fonction update() sur le queryset correspondant. Ensuite, vous faites quelque chose comme ça :

affected_surveys = Survey.objects.filter(
    # restrict your queryset by whatever fits you
    # ...
    ).update(active=True)

De cette façon, vous n'avez pas besoin d'appeler save() sur votre modèle car il est sauvegardé automatiquement. De plus, le update() La méthode renvoie le nombre d'instances d'enquête qui ont été affectées par votre mise à jour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X