Ich muss viele Objekte in der Datenbank speichern und möchte damit Modellinstanzen erstellen.
Mit django kann ich alle Modellinstanzen erstellen, mit MyModel(data)
und dann möchte ich sie alle speichern.
Derzeit habe ich so etwas:
for item in items:
object = MyModel(name=item.name)
object.save()
Ich frage mich, ob ich eine Liste von Objekten direkt speichern kann, z.
objects = []
for item in items:
objects.append(MyModel(name=item.name))
objects.save_all()
Wie speichere ich alle Objekte in einer Transaktion?
django
django-models
Alexis Métaireau
quelle
quelle
Antworten:
Ab der Django-Entwicklung gibt es
bulk_create
eine Objektmanager-Methode, die als Eingabe ein Array von Objekten verwendet, die mit dem Klassenkonstruktor erstellt wurden. Schauen Sie sich die Django-Dokumente anquelle
bulk_create
: docs.djangoproject.com/de/dev/ref/models/querysets/#bulk-createIf the model’s primary key is an AutoField it does not retrieve and set the primary key attribute, as save() does, unless the database backend supports it (currently only PostgreSQL).
bulk_create()
keine Signale auslöst. Ich wundere mich warum.Verwenden Sie die
bulk_create()
Methode. Es ist jetzt Standard in Django.Beispiel:
quelle
arbeitete für mich, um die manuelle Transaktionsbehandlung für die Schleife zu verwenden (postgres 9.1):
Tatsächlich ist es nicht dasselbe wie das Masseneinfügen einer 'nativen' Datenbank, aber es ermöglicht Ihnen, Transport- / Orms-Operationen / SQL-Abfrage-Analysekosten zu vermeiden / zu verringern
quelle
commit_on_success
mehr. Sie solltentransaction.atomic()
See: stackoverflow.com/questions/21861207/…So erstellen Sie Entitäten in großen Mengen aus spaltengetrennten Dateien, wobei alle nicht zitierenden und nicht entkommenden Routinen außer Acht gelassen werden:
quelle
Für eine einzeilige Implementierung können Sie einen Lambda-Ausdruck in einer Karte verwenden
Hier ordnet Lambda jedes Element in der Elementliste x zu und erstellt bei Bedarf einen Datenbankeintrag.
Lambda-Dokumentation
quelle
lambda
sein mussmap
ped überitems
:map(lambda name: MyModel.objects.get_or_create(name = name), items)
Die Verwendung von create führt zu einer Abfrage pro neuem Element. Wenn Sie die Anzahl der INSERT-Abfragen reduzieren möchten, müssen Sie etwas anderes verwenden.
Ich habe einige Erfolge mit dem Bulk Insert-Snippet erzielt, obwohl das Snippet ziemlich alt ist. Möglicherweise sind einige Änderungen erforderlich, damit es wieder funktioniert.
http://djangosnippets.org/snippets/446/
quelle
Schauen Sie sich diesen Blog-Beitrag im Bulkops- Modul an.
In meiner Django 1.3-App habe ich eine erhebliche Beschleunigung erfahren.
quelle
Am einfachsten ist es, die
create
Manager-Methode zu verwenden, mit der das Objekt in einem einzigen Schritt erstellt und gespeichert wird.quelle
name
es eindeutig ist und doppelte Eingaben möglich sind, ist es eine gute Idee, diese zu verwendenget_or_create
.