Erstellen, wenn nicht vorhanden

80

Ich habe eine Django-Anwendung, die Daten von einer Web-API liest und in eine Datenbank stellt.
Gibt es eine Möglichkeit, ein neues Objekt aus einem Modus zu erstellen, aber die doppelte Ausnahme zu verhindern, wenn das Objekt bereits vorhanden ist?

Mit anderen Worten, gibt es eine Möglichkeit, ein Objekt zu speichern, aber nichts zu tun, wenn es bereits vorhanden ist?

user1094786
quelle

Antworten:

154

Model.objects.get_or_create()

zweite
quelle
9
Wenn Sie es zu einem Link zu den Dokumenten machen, werden einige Zeichen hinzugefügt (und ich denke, es ist eine bessere Antwort)
2.
4
Dies scheint 2 Abfragen zu machen. Wenn ich das Objekt nur speichern möchte, falls es nicht vorhanden ist, gibt es eine Möglichkeit mit nur einer Abfrage? Ich denke, das Fangen führt dazu, IntegrityErrordass die aktuelle Transaktion abgebrochen wird und nicht ausreicht.
Amir Ali Akbari
Sie können den Integritätsfehler abfangen, wenn Sie einen Sicherungspunkt hinzufügen, z. B. mit transaction.atomic(stellen Sie sicher, dass Sie außerhalb des atomicBlocks abfangen , dh try: with acomic: create; except IntegrityErrores ist auch schwierig sicherzustellen, dass Sie keine anderen Integritätsfehler als den beabsichtigten abfangen
2.
Wenn Sie in der Lage sind, das zu fangen IntegrityError, zeigen meine Tests, dass es die Ausführungszeit fast halbiert, wenn der Datensatz im Vergleich zu existiert get_or_create().
Ron
46

In Django 1.7 können Sie außerdem Folgendes tun:

Model.objects.update_or_create()

Benoit Blanchon
quelle
3
Ich könnte das hier in 1.6 wirklich gebrauchen.
Erewok
2

In neueren Versionen von Django führt die Funktion save () standardmäßig ein UPDATE oder INSERT durch. Siehe hier .

crperez
quelle
Es sieht so aus, als ob es automatisch gut ausgewählt werden sollte. In meiner Datenbank werden derzeit jedoch jedes Mal Einträge dupliziert, wenn ich mein Skript zum Auffüllen der Datenbank ausführe.
Martin-Martin
Die save () -Methode prüft, ob die PK des Modells einen Wert hat. Der Autor müsste die Datenbank abfragen, um die Modellinstanz mit der richtigen PK zu erhalten, um diese Technik verwenden zu können. Die alleinige Verwendung von save () macht keine Magie.
Chickahoona