Wenn ich den Modelmanager bitte, ein Objekt zu erhalten, wird DoesNotExist
ausgelöst, wenn kein passendes Objekt vorhanden ist.
go = Content.objects.get(name="baby")
Anstatt DoesNotExist
, wie kann ich stattdessen go
None
haben?
Wenn ich den Modelmanager bitte, ein Objekt zu erhalten, wird DoesNotExist
ausgelöst, wenn kein passendes Objekt vorhanden ist.
go = Content.objects.get(name="baby")
Anstatt DoesNotExist
, wie kann ich stattdessen go
None
haben?
Ohne Ausnahme:
if SomeModel.objects.filter(foo='bar').exists():
x = SomeModel.objects.get(foo='bar')
else:
x = None
Verwendung einer Ausnahme:
try:
x = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
x = None
Es gibt eine gewisse Diskussion darüber, wann man in Python eine Ausnahme verwenden sollte. Einerseits "ist es einfacher um Vergebung zu bitten als um Erlaubnis". Obwohl ich dem zustimme, glaube ich, dass eine Ausnahme, nun ja, die Ausnahme bleiben sollte, und der "ideale Fall" sollte ohne sie auskommen.
Hier ist eine Variation der Hilfsfunktion, die es Ihnen ermöglicht, optional eine QuerySet
-Instanz zu übergeben, falls Sie das eindeutige Objekt (falls vorhanden) aus einem Queryset abrufen möchten, das nicht das all
-Objekt-Queryset des Modells ist (z. B. aus einer Teilmenge von Unterelementen eines Elternelements):
def get_unique_or_none(model, queryset=None, **kwargs):
"""
Führt die Abfrage auf dem angegebenen `queryset` aus
(das standardmäßig das `all`-Queryset des Standardmanagers des Modells ist)
und gibt das eindeutige Objekt zurück, das den angegebenen
Schlüsselwortargumenten entspricht. Gibt `None` zurück, wenn keine Übereinstimmung gefunden wird.
Wirft eine `model.MultipleObjectsReturned`-Ausnahme
auf, wenn mehr als eine Übereinstimmung gefunden wird.
"""
if queryset is None:
queryset = model.objects.all()
try:
return queryset.get(**kwargs)
except model.DoesNotExist:
return None
Dies kann auf zwei Arten verwendet werden, z. B.:
obj = get_unique_or_none(Model, **kwargs)
wie bereits besprochenobj = get_unique_or_none(Model, parent.children, **kwargs)
Wir können die in Django eingebauten Ausnahmen verwenden, die an die Modelle angehängt sind und als .DoesNotExist
benannt sind. Daher müssen wir die Ausnahme ObjectDoesNotExist
nicht importieren.
Statt dessen:
from django.core.exceptions import ObjectDoesNotExist
try:
content = Content.objects.get(name="baby")
except ObjectDoesNotExist:
content = None
Wir können dies tun:
try:
content = Content.objects.get(name="baby")
except Content.DoesNotExist:
content = None
Ich stand auch vor dem gleichen Problem. Es ist schwierig, jedes Mal try-except
zu schreiben und zu lesen, wenn Sie ein Element aus Ihrem Modell abrufen möchten, wie in der Antwort von @Arthur Debert. Also habe ich eine Getter
-Klasse erstellt, die von den Modellen abgeleitet wird:
class Getter:
@classmethod
def try_to_get(cls, *args, **kwargs):
try:
return cls.objects.get(**kwargs)
except Exception as e:
return None
class MyActualModel(models.Model, Getter):
pk_id = models.AutoField(primary_key=True)
...
So kann ich das tatsächliche Element von MyActualModel
oder None
bekommen:
MyActualModel.try_to_get(pk_id=1)
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.