GOOGLE ADS

Freitag, 29. April 2022

Django get_or_create kann das Feld nicht festlegen, wenn es mit iexact verwendet wird

Ich möchte name__iexactwith verwenden get_or_create, um nach Möglichkeit Doppelungen in vom Benutzer eingegebenen Feldern zu vermeiden.

Mein Provider-Modell hat ein Namensfeld, das ich in verwende get_or_create.

Die Suche funktioniert gut, aber wenn Sie zum ersten Mal eine Instanz erstellen, wie im p1/Timber-Beispiel unten (der name

schlägt fehl:

>>> p1, c1 = Provider.objects.get_or_create(name__iexact="Timber")
>>> p1, c1
(<Provider: >, True)
>>> p1.name
u''

Funktioniert hier wie erwartet:

>>> p2, c2 = Provider.objects.get_or_create(name="Cedar")
>>> p2.name, c2
('Cedar', True)
>>> p3, c3 = Provider.objects.get_or_create(name__iexact="Cedar")
>>> p3, c3
(<Provider: Cedar>, False)
>>> Provider.objects.get_or_create(name__iexact="cedar")
(<Provider: Cedar>, False)

Ist es __iexactmit dem Erstellungsteil von inkompatibel get_or_create, ist dies das erwartete Verhalten (und warum) oder bin ich auf einen Django-Fehler gestoßen?


Lösung des Problems

Was Sie sehen, ist das richtige Verhalten.

get_or_createist eine Abkürzung für 'Get and return the object matching' kwargs, wenn es nicht existiert, erstellen Sie es mit defaults'. Ihre Suche sucht nach einem Objekt, bei dem nameeine Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung mit 'cedar'. Dieses Objekt existiert, also wird es zurückgegeben. Nicht mehr, nicht weniger.

Wenn es jetzt keine Übereinstimmung gibt, hat Stéphane Recht, und Sie müssten nameim defaultsParameter angeben. Alle Suchvorgänge, die das Suchtrennzeichen enthalten, __werden aus den an übergebenen Parametern entfernt create().

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...