Fehler bei Zugriff auf Model mit "get" abfangen

Django, Flask, Bottle, WSGI, CGI…
Antworten
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Wenn ich z.B. mit

Code: Alles auswählen

profil_id_quelle = User.objects.get(id = quelle).id
auf ein Objekt zugreifen will, das nicht existiert, bekomme ich eine Fehlermeldung. Mir fällt natürlich nichts besseres ein, als dies mit try/except abzufangen. Das geht doch sicher auch anders. So etwa mit:

Code: Alles auswählen

if User.objects.get(id = quelle).exist()
... oder so?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ungetestet, aber eigentlich sollte das funktionieren:

Code: Alles auswählen

profile = User.objects.get(id = quelle)
if profile:
    profil_id_quelle = profile.id
else:
    #whatever
 
Gruß, noisefloor
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

noisefloor hat geschrieben: Dienstag 24. Oktober 2023, 14:29

Code: Alles auswählen

profile = User.objects.get(id = quelle)
if profile:
    profil_id_quelle = profile.id
else:
    #whatever
 
Das Problem ist ja, dass die erste Zeile schon einen Fehler erzeugt.
Benutzeravatar
grubenfox
User
Beiträge: 432
Registriert: Freitag 2. Dezember 2022, 15:49

Pitwheazle hat geschrieben: Dienstag 24. Oktober 2023, 15:16
noisefloor hat geschrieben: Dienstag 24. Oktober 2023, 14:29

Code: Alles auswählen

profile = User.objects.get(id = quelle)
if profile:
    profil_id_quelle = profile.id
else:
    #whatever
 
Das Problem ist ja, dass die erste Zeile schon einen Fehler erzeugt.
dann möglicherweise einen Defaultwert mitgeben (ebenfalls ungetestet)

Code: Alles auswählen

profile = User.objects.get(id = quelle, default=None)
if profile is not None:
    profil_id_quelle = profile.id
else:
    #whatever
 
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Ich habe das mit meinem aktuellen Code getestet:

Code: Alles auswählen

z = Zaehler.objects.get(user = profil_ziel, kategorie = q.kategorie, default = None)
if z.id == profil_ziel.id:
    print(z.kategorie, z.sj, z.hj)
else:
    print("Zähler mit Kategorie ", q.kategorie, " gibt es im Zielprofil nicht")

Code: Alles auswählen

Exception Value: 	

Cannot resolve keyword 'default' into field. Choices are: abbr_zaehler, aufgnr, fehler_zaehler, hilfe_zaehler, hinweis, hj, id, kategorie, kategorie_id, letzte, lsg_zaehler, optionen_text, richtig_of, sj, typ_anf, typ_end, user, user_id
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ach so, ja.

Da `get` eine spezifschen Fehler wirft macht dann doch `try.. except` Sinn. Ungetestet:

Code: Alles auswählen

try:
    profile = User.objects.get(id = quelle)
    profil_id_quelle = profile.id
except User.DoesNotExist:
    #whatever
    
Alternativ zu `get` könntet du auch mit `filter` arbeiten. Das liefert ein leeres Ergebnis, falls die Abfragebedingung nicht erfüllt wird.
Oder direkt sicherstellen, das `quelle` immer ein gültiger id-Wert ist.

Gruß, noisefloor
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Die von @noisefloor gezeigten Variante hat den Vorteil, dass "get" gleich noch prüft, ob tatsächlich nur ein Datensatz zur Query existiert.

In der freien Wildbahn sieht man manchmal noch diese Variante:

Code: Alles auswählen

profile = User.objects.filter(id = quelle).first()
if profile:
    profil_id_quelle = profile.id
else:
    #whatever
Antworten