8 Stimmen

Was tun, wenn Django-Abfrage gibt keine? Es gibt mir Fehler

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

10voto

math Punkte 2775

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

6voto

lprsd Punkte 80189
  1. FWIW, der Benutzername ist einzigartig. Sie können also verwenden

    to_friend = User.objects.get(username=friend_q)
  2. 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)
  3. 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
  4. 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.

1voto

Josh Smeaton Punkte 45913

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]

0 Stimmen

"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 !-)

0 Stimmen

To_friends wird niemals None sein - es wird immer noch ein Abfrageobjekt sein, das keine Ergebnisse liefert.

0 Stimmen

Oh, und auch das None-Objekt ist garantiert ein Singleton, so dass Sie besser mit dem Identitätsvergleich, dh: "wenn to_friends ist nicht None:" sein würde

0voto

user9767971 Punkte 11
to_friend = User.objects.filter(username=friend_q).first()

wenn es keinen Benutzer mit dem Benutzernamen friend_q gibt, erhält man to_friend = None, wenn es einen gibt, erhält man den Benutzer

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