Wenn ich den Modellmanager auffordere, ein Objekt abzurufen, wird es ausgelöst, DoesNotExist
wenn kein übereinstimmendes Objekt vorhanden ist.
go = Content.objects.get(name="baby")
Statt DoesNotExist
, wie kann ich go
sein , None
statt?
python
django
django-queryset
TIMEX
quelle
quelle
SomeModel.objects.filter(foo='bar').first()
das erste Match oder None zurückgeben. Es scheitert nicht, wenn es mehrere Fälle wiequeryset.get()
filter().first()
Ich denke, die Ausnahme ist der richtige Weg.Seit django 1.6 können Sie die first () -Methode wie folgt verwenden :
quelle
Aus Django-Dokumenten
Sie können die Ausnahme abfangen und zuweisen
None
, um zu gehen.quelle
Hierfür können Sie eine generische Funktion anlegen.
Verwenden Sie dies wie folgt:
go ist None, wenn kein anderer Eintrag übereinstimmt, wird der Content-Eintrag zurückgegeben.
Hinweis: Es wird eine Ausnahme ausgelöst. MultipleObjectsReturned, wenn mehr als ein Eintrag für name = "baby" zurückgegeben wird.
quelle
Sie können es so machen:
Jetzt kann die Variable go entweder das gewünschte Objekt oder None sein
Ref: https://docs.djangoproject.com/de/1.8/ref/models/querysets/#django.db.models.query.QuerySet.first
quelle
Um die Sache zu vereinfachen, hier ein Ausschnitt des Codes, den ich geschrieben habe, basierend auf den Eingaben aus den wunderbaren Antworten hier:
Und dann in Ihrem Modell:
Das ist es. Jetzt haben Sie MyModel.objects.get () sowie MyModel.objetcs.get_or_none ()
quelle
Sie könnten
exists
mit einem Filter verwenden:Nur eine Alternative, wenn Sie nur wissen möchten, ob es existiert
quelle
Note: If you only want to determine if at least one result exists (and don’t need the actual objects), it’s more efficient to use exists().
exists()
wird mit verwendet werdenif
Klausel bevor das Objekt daher holen einen doppelten Schlag auf den db verursacht. Ich werde den Kommentar trotzdem behalten, falls er jemand anderem hilft.Das Behandeln von Ausnahmen an verschiedenen Stellen in Ihren Ansichten kann sehr umständlich sein. Wie wäre es mit dem Definieren eines benutzerdefinierten Modellmanagers in der Datei models.py, z
und dann in die Content Model-Klasse aufnehmen
Auf diese Weise kann es leicht in den Ansichten behandelt werden, dh
quelle
return self.get(**kwargs)
sie für mich funktioniert. Um nicht zu sagen, dass irgendetwas mit der Antwort nicht stimmt, nur ein Tipp für alle, die versuchen, sie mit späteren Versionen zu verwenden (oder mit was auch immer, was sie davon abgehalten hat, für mich zu funktionieren).Dies ist eine dieser nervigen Funktionen , die Sie möglicherweise nicht erneut implementieren möchten:
quelle
get_object_or_None
aber festgestellt, dass er immer noch ausgelöst wird,MultipleObjectsReturned
wenn mehr als ein Objekt vorhanden ist. Daher könnte der Benutzer in Betracht ziehen, mit a zu umgebentry-except
(was die Funktion selbsttry-except
bereits hat).Wenn Sie eine einfache einzeilige Lösung wünschen, die keine Ausnahmebehandlung, bedingte Anweisungen oder eine Anforderung von Django 1.6+ umfasst, gehen Sie stattdessen folgendermaßen vor:
quelle
Ich denke, es ist keine schlechte Idee zu verwenden
get_object_or_404()
Dieses Beispiel entspricht:
Weitere Informationen zu get_object_or_404 () finden Sie in der Online-Dokumentation zu django.
quelle
Ab Django 1.7 können Sie Folgendes tun:
Der Vorteil von "MyQuerySet.as_manager ()" besteht darin, dass beide der folgenden Funktionen funktionieren:
quelle
Hier ist eine Variation der Hilfsfunktion, mit der Sie optional eine
QuerySet
Instanz übergeben können, falls Sie das eindeutige Objekt (falls vorhanden) aus einem anderen Abfragesatz als dem Objektabfragesatz des Modellsall
abrufen möchten (z. B. aus einer Teilmenge von untergeordneten Elementen, die zu a gehören übergeordnete Instanz):Dies kann auf zwei Arten verwendet werden, z.
obj = get_unique_or_none(Model, **kwargs)
wie zuvor besprochenobj = get_unique_or_none(Model, parent.children, **kwargs)
quelle
Ohne Ausnahme:
Verwenden einer Ausnahme:
Es gibt ein wenig Streit darüber, wann man in Python eine Ausnahme verwenden sollte. Einerseits "ist es einfacher, um Vergebung zu bitten als um Erlaubnis". Obwohl ich damit einverstanden bin, glaube ich, dass eine Ausnahme bleiben sollte, nun, die Ausnahme, und der "Idealfall" sollte laufen, ohne eine zu treffen.
quelle
Wir können die in Django integrierte Ausnahme verwenden, die an die als
.DoesNotExist
. Wir müssen also keineObjectDoesNotExist
Ausnahme importieren .Stattdessen tun:
Wir können das schaffen:
quelle
Dies ist eine Nachahmerin von Djangos get_object_or_404, außer dass die Methode None zurückgibt. Dies ist äußerst nützlich, wenn wir die
only()
Abfrage verwenden müssen, um nur bestimmte Felder abzurufen. Diese Methode kann ein Modell oder einen Abfragesatz akzeptieren.quelle
Vielleicht ist es besser, wenn Sie verwenden:
quelle