Ich möchte eine Tabelle mit Django aktualisieren - so etwas in Raw SQL:
update tbl_name set name = 'foo' where name = 'bar'
Mein erstes Ergebnis ist so etwas - aber das ist böse, nicht wahr?
list = ModelClass.objects.filter(name = 'bar')
for obj in list:
obj.name = 'foo'
obj.save()
Gibt es einen eleganteren Weg?
django
django-models
Thomas Schwärzl
quelle
quelle
ModelClass
Herangehensweise? Dann füttereAntworten:
Aktualisieren:
Die Version Django 2.2 hat jetzt ein Bulk-Update .
Alte Antwort:
Weitere Informationen finden Sie im folgenden Abschnitt zur Django-Dokumentation
Kurz gesagt, Sie sollten in der Lage sein:
Sie können
F
Objekte auch zum Inkrementieren von Zeilen verwenden:Siehe die Dokumentation .
Beachten Sie jedoch Folgendes:
ModelClass.save
Methode (wenn Sie also eine Logik haben, wird diese nicht ausgelöst)..update()
ein QuerySet nicht in Scheiben schneiden, es muss sich in einem ursprünglichen QuerySet befinden, sodass Sie sich auf die Methoden.filter()
und stützen müssen.exclude()
.quelle
save()
,DateTimeField
Felder mitauto_now=True
( „modifizierte“ Spalten) werden nicht aktualisiert.ModelClass.objects.filter(name = 'bar').update(name="foo")
erfüllt nicht den Zweck der Massenaktualisierung, wenn ich unterschiedliche Daten für unterschiedliche IDs habe, wie könnte ich das tun, ohne Schleife zu verwenden?Entry.objects.all().update(title=F('blog__title'))
. Docs haben eine kleine Erwähnung davon. Wenn Sie Daten aus einem anderen ModellErwägen Sie die Verwendung
django-bulk-update
fand hier auf GitHub .Installieren:
pip install django-bulk-update
Implementieren: (Code direkt aus der ReadMe-Datei des Projekts)
Update: Wie Marc in den Kommentaren hervorhebt, ist dies nicht zum gleichzeitigen Aktualisieren von Tausenden von Zeilen geeignet. Obwohl es für kleinere Chargen von 10 bis 100 geeignet ist. Die Größe des für Sie geeigneten Stapels hängt von Ihrer CPU- und Abfragekomplexität ab. Dieses Werkzeug ähnelt eher einem Schubkarren als einem Muldenkipper.
quelle
Django 2.2 - Version hat jetzt ein
bulk_update
Verfahren ( Release Notes ).https://docs.djangoproject.com/de/stable/ref/models/querysets/#bulk-update
Beispiel:
quelle
Wenn Sie für eine Auflistung von Zeilen denselben Wert festlegen möchten , können Sie die update () -Methode in Kombination mit einem beliebigen Abfragebegriff verwenden, um alle Zeilen in einer Abfrage zu aktualisieren:
Wenn Sie eine Sammlung von Zeilen mit unterschiedlichen Werten abhängig von einer bestimmten Bedingung aktualisieren möchten, können Sie die Aktualisierungen im besten Fall nach Werten stapeln. Angenommen, Sie haben 1000 Zeilen, in denen Sie eine Spalte auf einen der X-Werte setzen möchten. Dann können Sie die Stapel im Voraus vorbereiten und dann nur X Update-Abfragen ausführen (jede hat im Wesentlichen die Form des ersten Beispiels oben) + das anfängliche SELECT -Abfrage.
Wenn für jede Zeile ein eindeutiger Wert erforderlich ist, kann eine Abfrage pro Aktualisierung nicht vermieden werden. Schauen Sie sich vielleicht andere Architekturen wie CQRS / Event Sourcing an, wenn Sie in letzterem Fall Leistung benötigen.
quelle
Über diesen Link erhalten Sie weitere Informationen zum Bulk-Update und zum Erstellen. Massenaktualisierung und Erstellen
quelle