Wie verwende ich „get_or_create()“ in Django?

Lesezeit: 4 Minuten

Stephens Benutzeravatar
Stephan

Ich versuche es zu verwenden get_or_create() für einige Felder in meinen Formularen, aber ich erhalte eine 500-Fehlermeldung, wenn ich das versuche.

Eine der Zeilen sieht so aus:

customer.source = Source.objects.get_or_create(name="Website")

Der Fehler, den ich für den obigen Code erhalte, ist:

„(, False)“ kann nicht zugewiesen werden: „Customer.source“ muss eine „Source“-Instanz sein.

Astras Benutzeravatar
Astra

Aus der Dokumentation get_or_create:

# get_or_create() a person with similar first names.

p, created = Person.objects.get_or_create(
    first_name="John",
    last_name="Lennon",
    defaults={'birthday': date(1940, 10, 9)},
)

# get_or_create() didn't have to create an object.
>>> created
False

Erläuterung:
Felder, die auf Ähnlichkeit geprüft werden sollen, müssen außen genannt werden defaults. Die restlichen Felder müssen eingebunden werden defaults. Falls das CREATE-Ereignis auftritt, werden alle Felder berücksichtigt.

Es sieht so aus, als müssten Sie zu einem Tupel und nicht zu einer einzelnen Variablen zurückkehren. Gehen Sie dazu wie folgt vor:

customer.source,created = Source.objects.get_or_create(name="Website")

  • Zu Ihrer Information: erstellt ist ein boolescher Wert. True, wenn es erstellt wird, False, wenn es abgerufen wird

    – Josh

    4. Okt. 2018 um 8:45 Uhr

  • Eine zusätzliche save() ist überflüssig?

    – Zypro

    17. Dezember 2019 um 10:56

  • @zypro Es ist wie create()Objekt erstellen und alles in einem Schritt speichern und benötigt keines save()

    – Amin Mir

    19. Juni 2020 um 6:05

  • HINWEIS: Ab Django 3.2 wird jede Anweisung übergeben defaults werden auch dann ausgewertet, wenn kein neues Objekt erstellt wird. Am Ende habe ich wann immer eine Try-Catch-Anweisung geschrieben create benötigt eine komplexe Anweisung zur Ausführung.

    – Iqbal

    26. Juli 2021 um 17:03 Uhr


  • Wofür steht das p in „p,created = Person…“? Was ist der Zweck?

    – Alkadelik

    22. März um 21:31 Uhr

Tobus Benutzeravatar
Tobu

get_or_create gibt ein Tupel zurück.

customer.source, created = Source.objects.get_or_create(name="Website")

  • Oder, wenn Ihnen die boolesche Flagge egal ist: customer.source = Source.objects.get_or_create(name="Website")[0]

    – mipadi

    21. Dezember 2009 um 16:57

  • @mipadi Ich würde es vorziehen customer.source, _ = Source.objects.get_or_create(name="Website")da es die Tatsache, dass ein Tupel zurückgegeben wurde, deutlicher macht und so zukünftige Fehler vermeidet.

    – Solomon Ucko

    4. April 2019 um 2:32

Tushar Patils Benutzeravatar
Tushar Patil

get_or_create() gibt ein Tupel zurück:

customer.source, created  = Source.objects.get_or_create(name="Website")
  • created hat einen booleschen Wert, wird erstellt oder nicht.

  • customer.source hat ein Objekt von get_or_create() Methode.

Nach der Antwort von @Tobu und dem Kommentar von @mipadi würde ich auf eine eher pythonische Art und Weise Folgendes verwenden, wenn ich kein Interesse an der erstellten Flagge habe:

customer.source, _ = Source.objects.get_or_create(name="Website")

Benutzer-Avatar von wlashell
welch

Das Problem, auf das Sie stoßen, ist ein dokumentiertes Merkmal von get_or_create.

Bei Verwendung anderer Schlüsselwortargumente als „defaults“ wird der Rückgabewert von get_or_create ist eine Instanz. Aus diesem Grund werden Ihnen die Parens im Rückgabewert angezeigt.

Du könntest benutzen customer.source = Source.objects.get_or_create(name="Website")[0] um den richtigen Wert zu erhalten.

Hier ist ein Link zur Dokumentation:
http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs

Die Methode get_or_create würde tatsächlich ein Tupel zurückgeben.

Der Trick mit der Methode get_or_create besteht darin, dass sie tatsächlich ein Tupel von (Objekt, erstellt) zurückgibt. Das erste Element ist eine Instanz des Modells, das Sie abrufen möchten, und das zweite ist ein boolesches Flag, das angibt, ob die Instanz erstellt wurde oder nicht. True bedeutet, dass die Instanz mit der Methode get_or_create erstellt wurde, und False bedeutet, dass sie aus der Datenbank abgerufen wurde

Sie können also beispielsweise die Quellinstanz abrufen

 ```   customer.source = Source.objects.get_or_create(name="Website")[0]
 ```

Kai – Kazuya Itos Benutzeravatar
Kai – Kazuya Ito

get_or_create() gibt das Tupel zurück, das 2 Werte enthält und der 1. Wert ist ein Objekt und der 2. Wert ist der boolesche Wert, der angibt, ob ein neues Objekt erstellt wird oder nicht, wie unten gezeigt:

 # 1st   # 2nd
(object, boolean)

Also, wenn Sie beides wollen ein Objekt Und ein boolescher Wertfügen Sie eine weitere Variable ein created nach customer.source Wie nachfolgend dargestellt:

                 # Here
customer.source, created = Source.objects.get_or_create(name="Website")
# object         # boolean

Und wenn Sie nur wollen ein Objekt ohne booleschen Wert, put [0] direkt im Anschluss get_or_create() Wie nachfolgend dargestellt:

                                                       # Here ↓↓↓
customer.source = Source.objects.get_or_create(name="Website")[0]
# object

Und wenn Sie nur wollen ein boolescher Wert ohne ein Objekt zu setzen [1] direkt im Anschluss get_or_create() Wie nachfolgend dargestellt:

                                               # Here ↓↓↓
created = Source.objects.get_or_create(name="Website")[1]
# boolean

1450240cookie-checkWie verwende ich „get_or_create()“ in Django?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy