94 votes

Django : Appeler .update() sur une seule instance de modèle récupérée par .get() ?

J'ai une fonction qui appelle actuellement Models.object.get() qui renvoie soit 0 soit 1 objet modèle. S'il renvoie 0, je crée une nouvelle instance de modèle dans le fichier except DoesNotExist de la fonction. Sinon, je voudrais mettre à jour les champs dans l'instance préexistante, sans en créer une nouvelle. À l'origine, j'essayais d'appeler .update() sur l'instance qui a été trouvée, mais .update() semble ne pouvoir être appelé que sur un QuerySets. Comment puis-je modifier une douzaine de champs, sans appeler .filter() et en comparant les longueurs pour savoir si je dois créer ou mettre à jour une instance préexistante ?

5voto

Rémi Héneault Points 373

Comme @Nils l'a mentionné, vous pouvez utiliser la fonction update_fields de l'argument mot-clé de la save() pour spécifier manuellement les champs à mettre à jour.

obj_instance = Model.objects.get(field=value)
obj_instance.field = new_value
obj_instance.field2 = new_value2

obj_instance.save(update_fields=['field', 'field2'])

En update_fields La valeur doit être une liste des champs à mettre à jour sous forme de chaînes de caractères.

Voir https://docs.djangoproject.com/en/2.1/ref/models/instances/#specifying-which-fields-to-save

0voto

Aragon Points 1099

J'utilise le code suivant dans de tels cas :

obj, created = Model.objects.get_or_create(id=some_id)

if not created:
   resp= "It was created"
else:
   resp= "OK"
   obj.save()

0voto

omar ahmed Points 20

Mettre à jour :

1 - exemple individuel : récupérer l'instance et la mettre à jour manuellement get() récupérer l'objet individuel

post = Post.objects.get(id=1)
post.title = "update title"
post.save()

2 - Ensemble d'instances : utiliser la méthode update() qui ne fonctionne qu'avec le queryset qui serait retourné par la méthode filter()

Post.objects.filter(author='ahmed').update(title='updated title for ahmed')

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