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?

Antworten:


154

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


2

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.