J'aimerais mettre à jour une table avec Django - quelque chose comme ça en SQL brut:
update tbl_name set name = 'foo' where name = 'bar'
Mon premier résultat est quelque chose comme ça - mais c'est méchant, n'est-ce pas?
list = ModelClass.objects.filter(name = 'bar')
for obj in list:
obj.name = 'foo'
obj.save()
Y a-t-il une manière plus élégante?
django
django-models
Thomas Schwärzl
la source
la source
ModelClass
approche? Puis alimentez Django commeRéponses:
Mettre à jour:
La version Django 2.2 a maintenant un bulk_update .
Ancienne réponse:
Reportez-vous à la section de documentation django suivante
En bref, vous devriez pouvoir utiliser:
Vous pouvez également utiliser des
F
objets pour faire des choses comme l'incrémentation de lignes:Consultez la documentation .
Cependant, notez que:
ModelClass.save
méthode (donc si vous avez une logique à l'intérieur, elle ne sera pas déclenchée)..update()
sur un QuerySet découpé, il doit être sur un QuerySet d'origine, vous devrez donc vous appuyer sur les méthodes.filter()
et.exclude()
.la source
save()
, lesDateTimeField
champs avecauto_now=True
(colonnes "modifiées") ne seront pas mis à jour.ModelClass.objects.filter(name = 'bar').update(name="foo")
ne remplit pas l'objectif de la mise à jour en masse, si j'ai des données différentes pour différents identifiants, comment puis-je le faire sans utiliser de boucle?Entry.objects.all().update(title=F('blog__title'))
. Les documents en font une petite mention. Si vous souhaitez extraire des données d'un autre modèle pour mettre à jour vos entrées, vous devrez exécuter une boucle forPensez à utiliser
django-bulk-update
found here sur GitHub .Installer:
pip install django-bulk-update
Implémenter: (code extrait directement du fichier ReadMe des projets)
Mise à jour: comme Marc le souligne dans les commentaires, cela ne convient pas pour mettre à jour des milliers de lignes à la fois. Bien qu'il soit adapté aux petits lots de 10 à 100. La taille du lot qui vous convient dépend de votre processeur et de la complexité de vos requêtes. Cet outil ressemble plus à une brouette qu'à un camion à benne basculante.
la source
La version Django 2.2 dispose désormais d'une
bulk_update
méthode ( notes de publication ).https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-update
Exemple:
la source
Si vous souhaitez définir la même valeur sur une collection de lignes , vous pouvez utiliser la méthode update () combinée avec n'importe quel terme de requête pour mettre à jour toutes les lignes dans une requête:
Si vous souhaitez mettre à jour une collection de lignes avec des valeurs différentes selon certaines conditions, vous pouvez dans le meilleur des cas regrouper les mises à jour en fonction de valeurs. Supposons que vous ayez 1000 lignes dans lesquelles vous souhaitez définir une colonne sur l'une des valeurs X, puis vous pouvez préparer les lots à l'avance, puis n'exécuter que X requêtes de mise à jour (chacune ayant essentiellement la forme du premier exemple ci-dessus) + le SELECT initial -requete.
Si chaque ligne nécessite une valeur unique, il n'y a aucun moyen d'éviter une requête par mise à jour. Peut-être envisager d'autres architectures comme CQRS / Event sourcing si vous avez besoin de performances dans ce dernier cas.
la source
Vous pouvez consulter ce lien pour obtenir plus d'informations sur la mise à jour et la création groupées. Mise à jour et création en masse
la source