it-swarm.com.de

Prüfen Sie, ob ein Objekt vorhanden ist

Ich muss überprüfen, ob Model.objects.filter(...) etwas aufgedreht hat, aber nichts einfügen muss. Mein Code ist bisher:

user_pass = log_in(request.POST)  # form class
if user_pass.is_valid():
    cleaned_info = user_pass.cleaned_data
    user_object = User.objects.filter(email = cleaned_info['username'])
39
sinθ

Da filter eine QuerySet zurückgibt, können Sie mit count prüfen, wie viele Ergebnisse zurückgegeben wurden. Dies setzt voraus, dass Sie die Ergebnisse nicht wirklich benötigen.

num_results = User.objects.filter(email = cleaned_info['username']).count()

Nachdem Sie sich die Dokumentation angesehen haben, ist es besser, len in Ihrem Filter aufzurufen, wenn Sie die Ergebnisse später verwenden möchten, da Sie nur eine SQL-Abfrage erstellen:

Ein count () - Aufruf führt hinter den Kulissen einen SELECT COUNT (*) aus. Daher sollten Sie immer count () verwenden, anstatt den gesamten Datensatz in Python-Objekte zu laden und len () für das Ergebnis aufzurufen (es sei denn, Sie müssen die Objekte laden sowieso in den Speicher, in diesem Fall wird len () schneller sein).

num_results = len(user_object)
42
joneshf

Ich denke, dass die logischste und effizienteste Sicht die Verwendung der exists () - Funktion des Querysets ist, die hier dokumentiert ist:

https://docs.djangoproject.com/de/dev/ref/models/querysets/#Django.db.models.query.QuerySet.exists

In Ihrem obigen Beispiel würde ich einfach schreiben:

if User.objects.filter(email = cleaned_info['username']).exists():
    # at least one object satisfying query exists
else:
    # no object satisfying query exists
80
mpaf

der boolesche Wert eines leeren QuerySet ist ebenfalls False, also könnten Sie auch nur ...

...
if not user_object:
   do insert or whatever etc.
6
David Lam

Sie können auch get_object_or_404 () verwenden. Es wird ein Http404 ausgegeben, wenn das Objekt nicht gefunden wurde:

user_pass = log_in(request.POST) #form class
if user_pass.is_valid():
    cleaned_info = user_pass.cleaned_data
    user_object = get_object_or_404(User, email=cleaned_info['username'])
    # User object found, you are good to go!
    ...
5
César

Sie können verwenden:

try:
   # get your models
except ObjectDoesNotExist:
   # do something
3
acarayol

wenn Benutzer vorhanden sind, können Sie den Benutzer in user_object abrufen, ansonsten wird user_object keiner sein.

try:
    user_object = User.objects.get(email = cleaned_info['username'])
except User.DoesNotExist:
    user_object = None
if user_object:
    # user exist
    pass
else:
    # user does not exist
    pass
1
paras chauhan