410 Stimmen

Wie erhalte ich das Objekt, wenn es existiert, oder None, wenn es in Django nicht existiert?

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?

1voto

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.

1voto

Gary Punkte 4066

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.:

  1. obj = get_unique_or_none(Model, **kwargs) wie bereits besprochen
  2. obj = get_unique_or_none(Model, parent.children, **kwargs)

1voto

zakiakhmad Punkte 695

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

1voto

Ersel Er Punkte 535

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)

-2voto

Bruce Martin Punkte 9

Wie wäre es mit einem Stück? Es wird auf ein Limit von 1 analysiert.

gehe = Content.objects.filter(name="baby")[0]

0 Stimmen

Sarkasmus ist nicht mit den besten Praktiken von SO (Stack Overflow) vereinbar. Berichterstattung.

CodeJaeger.com

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.

Powered by:

X