to_friend = User.objects.filter(username=friend_q)[0:1]
Wenn 'friend_q' NICHT in User.username... enthalten ist, wird ein Fehler ausgegeben. Was ist die empfohlene Taktik?
Dankeschön
to_friend = User.objects.filter(username=friend_q)[0:1]
Wenn 'friend_q' NICHT in User.username... enthalten ist, wird ein Fehler ausgegeben. Was ist die empfohlene Taktik?
Dankeschön
Wenn friend_q kein in der Datenbank vorhandener Benutzer ist, ist to_friend gleich einer leeren Liste.
>>> from django.contrib.auth.models import User
>>> User.objects.filter(username='does-not-exist')
[]
Es ist jedoch besser, die Methode get() zu verwenden, um einen bestimmten Eintrag zu suchen:
>>> User.objects.get(username='does-exist')
<User: does-exist>
>>> User.objects.get(username='does-not-exist')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.5/django/db/models/manager.py", line 120, in get
File "/usr/lib/python2.5/django/db/models/query.py", line 305, in get
DoesNotExist: User matching query does not exist.
Sie können nun die DoesNotExist-Ausnahme abfangen und entsprechende Maßnahmen ergreifen.
try:
to_friend = User.objects.get(username=friend_q)
except User.DoesNotExist:
# do something, raise error, ...
FWIW, der Benutzername ist einzigartig. Sie können also verwenden
to_friend = User.objects.get(username=friend_q)
Wenn Sie eine 404-Meldung ausgeben wollen, wenn der Benutzer nicht existiert, können Sie das auch tun,
from django.shortcuts import get_object_or_404
to_friend = get_object_or_404(User,username=friend_q)
Um Fehler zu vermeiden, können Sie es einfach in den Try-Exceptions-Block setzen, sehr pythonisch.
try:
to_friend = User.objects.get(username=friend_q)
except User.DoesNotExist:
to_friend = None
Da dies eine häufige Anforderung ist, sollten Sie in Erwägung ziehen, Folgendes zu definieren get_user_or_none
für den UserManager und andere Manager, die eine None
zurück, ähnlich wie bei get_object_or_404. Dies war in der Erwägung, für django core, aber wurde nicht aufgenommen, für was auch immer der Grund. Dennoch ist es eine praktische, 4-Zeilen-Funktion für Modelle, die None
zurück.
Der Grund für die Fehlermeldung ist, dass Sie versuchen, das Query-Objekt auszuwerten, obwohl es nichts enthält. Mit [0:1] am Ende wird versucht, das erste Element aus einer leeren Liste zu nehmen. Wenn Sie den Ausdruck wie unten aufteilen, können Sie prüfen, ob die Liste leer ist, bevor Sie ein Element aus ihr entnehmen.
to_friends = User.objects.filter(username=friend_q)
if to_friends:
to_friend = to_friends[0]
"to_friends[0]" ergibt ein einzelnes Objekt, während der Code '[0:1]' eine Liste mit einem einzelnen Objekt ergibt. Das ist nicht ganz dasselbe !-)
To_friends wird niemals None sein - es wird immer noch ein Abfrageobjekt sein, das keine Ergebnisse liefert.
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.