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'])
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)
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
der boolesche Wert eines leeren QuerySet ist ebenfalls False, also könnten Sie auch nur ...
...
if not user_object:
do insert or whatever etc.
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!
...
Sie können verwenden:
try:
# get your models
except ObjectDoesNotExist:
# do something
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