Mise à jour en masse dans Django
Dans Django, par défaut, chaque modèle dispose d’un gestionnaire objects
. Ce gestionnaire peut faire beaucoup de choses telles que récupérer des instances de modèle, filtrer des instances de modèle, supprimer des instances de modèle. Nous pouvons même créer notre propre gestionnaire en héritant du gestionnaire de base fourni par Django.
Désormais, chaque requête que nous appliquons, telle que la récupération d’une seule instance de modèle à l’aide de la fonction get()
ou le filtrage des instances à l’aide de la méthode filter()
, atteint la base de données une fois. Cela signifie que si nous avons cinq instructions get()
comme suit, la base de données sera interrogée cinq fois individuellement.
person = Person.objects.get(id=1)
person = Person.objects.get(id=2)
person = Person.objects.get(id=3)
person = Person.objects.get(id=4)
person = Person.objects.get(id=5)
C’est une approche inefficace car nous atteignons la base de données individuellement pour une seule tâche. Si nous devons interroger de nombreuses instances ou mettre à jour de nombreuses instances pour certains modèles, cette approche peut ralentir considérablement notre application.
Pour résoudre ce problème, Django a une fonction intégrée qui peut être utilisée pour mettre à jour plusieurs instances dans une seule requête, en général.
Méthode bulk_update()
dans Django
La méthode bulk_update
a trois paramètres, à savoir objs
, fields
et batch_size
.
objs
- Une liste des opérations à effectuerfields
- Une liste de champs sur lesquels les requêtes doivent être effectuéesbatch_size
- Le nombre d’objets à enregistrer dans une seule requête de base de données. C’est un argument optionnel. Par défaut, tous les objets sont mis à jour et enregistrés.
Prenons un exemple. Supposons que nous ayons un modèle Person
et que nous devions incrémenter l’âge de toutes les personnes de 1
en utilisant la méthode bulk_update()
. Nous ferions ce qui suit.
Dans models.py
:
from django.db import models
class Person(models.Model):
username = models.CharField(max_length=200, unique=True)
firstName = models.CharField(max_length=200)
middleName = models.CharField(max_length=200)
lastName = models.CharField(max_length=200)
age = models.IntegerField(default=0)
Dans views.py
:
people = Person.objects.all()
for person in people:
person.age += 1
Person.objects.bulk_update(people, update_fields=["age"])
Cette opération mettra à jour l’âge de toutes les personnes en une seule requête, ce qui est très efficace.
Inconvénients de la méthode bulk_update()
La méthode bulk_update()
est excellente, mais toutes les paillettes ne sont pas dorées. Cette méthode présente quelques inconvénients.
- En utilisant la méthode
bulk_update()
, on ne peut pas mettre à jour les clés primaires des instances. - Chaque modèle possède une méthode
save()
. Cette méthode n’est pas appelée lors de l’utilisation de la méthodebulk_update()
. - Nous devons mentionner une taille de lot si nous mettons à jour de nombreuses colonnes pour un grand nombre d’enregistrements. Sinon, la requête SQL générée sera très longue.