114 votes

Comment mettre à jour des champs dans un modèle sans créer un nouvel enregistrement dans django ?

J'ai un modèle dans django que je veux mettre à jour uniquement, c'est-à-dire que lorsque je l'appelle et que je définis les données, il ne créera pas de nouvel enregistrement, il mettra uniquement à jour l'enregistrement existant. Comment puis-je faire cela ? Voici ce que j'ai :

class TemperatureData(models.Model):   
    date = models.DateTimeField()   
    value = models.PositiveIntegerField()   
    alert = models.BooleanField()

185voto

ars Points 35803

Si vous obtenez une instance de modèle à partir de la base de données, l'appel de la méthode de sauvegarde mettra toujours à jour cette instance. Par exemple :

t = TemperatureData.objects.get(id=1)
t.value = 999  # change field
t.save() # this will update only

Si votre objectif est d'empêcher tout INSERT, vous pouvez remplacer l'option save teste si la clé primaire existe et lève une exception. Voir ce qui suit pour plus de détails :

38voto

Zaman Afzal Points 814

L'idéal serait de procéder de cette façon

t = TemperatureData.objects.get(id=1)
t.value = 999
t.save(['value'])

Cela vous permet de spécifier quelle colonne doit être sauvegardée et les autres sont laissées telles qu'elles sont actuellement dans la base de données. ( https://code.djangoproject.com/ticket/4102 ) !

7 votes

J'aime cette réponse, mais avec la version actuelle vous devez utiliser t.save(update_fields=['value']) a forcer une mise à jour .

33voto

Roman Konoval Points 2273

Parfois, il peut être nécessaire d'exécuter la mise à jour de manière atomique, c'est-à-dire en utilisant une demande de mise à jour vers la base de données sans la lire au préalable.

También get - set attribute - save peut poser des problèmes si de telles mises à jour peuvent être effectuées simultanément ou si vous devez définir la nouvelle valeur en fonction de l'ancienne valeur du champ.

Dans de tels cas expressions de requête en même temps que update peut être utile :

TemperatureData.objects.filter(id=1).update(value=F('value') + 1)

4voto

miku Points 63392

Django dispose d'une documentation à ce sujet sur son site Web, voir : Sauvegarde des modifications apportées aux objets . Pour résumer :

pour sauvegarder les modifications apportées à un objet qui se trouve déjà dans la base de données, utilisez save() .

4voto

Viraj.Hadoop Points 154

Dans mon scénario, je veux mettre à jour le statut du statut en fonction de son id.

student_obj = StudentStatus.objects.get(student_id=101)
student_obj.status= 'Enrolled'
student_obj.save()

Ou si vous voulez le dernier identifiant de la table Student_Info, vous pouvez utiliser ce qui suit.

student_obj = StudentStatus.objects.get(student_id=StudentInfo.objects.last().id)
student_obj.status= 'Enrolled'
student_obj.save()

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