Bulk-Update in Django
In Django hat jedes Modell standardmäßig einen Object
-Manager. Dieser Manager kann viele Dinge tun, z. B. Modellinstanzen abrufen, Modellinstanzen filtern, Modellinstanzen löschen. Wir können sogar unseren eigenen Manager erstellen, indem wir den von Django bereitgestellten Basismanager erben.
Nun trifft jede einzelne Anfrage, die wir anwenden, wie das Abrufen einer einzelnen Modellinstanz mit der Funktion get()
oder das Filtern von Instanzen mit der Methode filter()
, einmal auf die Datenbank. Das heißt, wenn wir wie folgt fünf get()
-Anweisungen haben, wird die Datenbank fünfmal einzeln abgefragt.
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)
Dies ist ein ineffizienter Ansatz, da wir die Datenbank für eine einzelne Aufgabe einzeln bearbeiten. Wenn wir für einige Modelle viele Instanzen abfragen oder viele Instanzen aktualisieren müssen, kann dieser Ansatz unsere Anwendung erheblich verlangsamen.
Um dieses Problem zu lösen, verfügt Django über eine integrierte Funktion, mit der im Allgemeinen mehrere Instanzen in einer Abfrage aktualisiert werden können.
bulk_update()
Methode in Django
Die Methode bulk_update
hat drei Parameter, nämlich objs
, fields
und batch_size
.
objs
- Eine Liste der auszuführenden Operationenfields
- Eine Liste von Feldern, für die die Abfragen durchgeführt werden müssenbatch_size
- Die Anzahl der Objekte, die in einer einzigen Datenbankabfrage gespeichert werden sollen. Es ist ein optionales Argument. Standardmäßig werden alle Objekte aktualisiert und gespeichert.
Betrachten Sie ein Beispiel. Angenommen, wir haben ein Person
-Modell und müssen das Alter aller Personen mit der Methode bulk_update()
um 1
erhöhen. Wir würden folgendes tun.
In 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)
In views.py
:
people = Person.objects.all()
for person in people:
person.age += 1
Person.objects.bulk_update(people, update_fields=["age"])
Diese Operation aktualisiert das Alter aller Personen in einer einzigen Abfrage, was sehr effizient ist.
Nachteile der Methode bulk_update()
Die Methode bulk_update()
ist hervorragend, aber nicht alles Glitzer ist Gold. Diese Methode hat einige Nachteile.
- Mit der Methode
bulk_update()
können wir die Primärschlüssel von Instanzen nicht aktualisieren. - Jedes Modell hat eine Methode
save()
. Diese Methode wird bei Verwendung der Methodebulk_update()
nicht aufgerufen. - Wir müssen eine Batchgröße angeben, wenn wir viele Spalten für viele Datensätze aktualisieren. Andernfalls wird die generierte SQL-Abfrage sehr lang.