Bulk-Update in Django

Vaibhav Vaibhav 29 Juni 2021
  1. bulk_update() Methode in Django
  2. Nachteile der Methode bulk_update()
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.

  1. objs - Eine Liste der auszuführenden Operationen
  2. fields - Eine Liste von Feldern, für die die Abfragen durchgeführt werden müssen
  3. batch_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 Methode bulk_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.
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.