Ich möchte name__iexact
with 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 __iexact
mit 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_create
ist 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 name
eine Ü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 name
im defaults
Parameter angeben. Alle Suchvorgänge, die das Suchtrennzeichen enthalten, __
werden aus den an übergebenen Parametern entfernt create()
.
Keine Kommentare:
Kommentar veröffentlichen