Was ist die empfohlene Redewendung, um zu überprüfen, ob eine Abfrage Ergebnisse zurückgibt?
Beispiel:
orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc')
# If any results
# Do this with the results without querying again.
# Else, do something else...
Ich nehme an, es gibt verschiedene Möglichkeiten, dies zu überprüfen, aber ich würde gerne wissen, wie ein erfahrener Django-Benutzer dies tun würde. Die meisten Beispiele in den Dokumenten ignorieren einfach den Fall, in dem nichts gefunden wurde ...
django
django-queryset
Niklas
quelle
quelle
list
Ergebnis erzeugen, wenn Datensätze vorhanden sind. Der Code dort wird nur einmal in die Datenbank gelangen. Wenn sie verwendet habenexist()
odercount()
zuerst prüfen, ob Datensätze zurückgegeben werden, greifen sie zweimal auf die Datenbank zu (einmal zum Überprüfen, einmal zum Abrufen der Datensätze). Dies ist eine spezielle Situation. Es bedeutet nicht, dass im allgemeinen Fall die bevorzugte Methode, um zu wissen, ob eine Abfrage Datensätze zurückgibt, die Verwendung von doif queryset:...
if not my_objects:
zu demonstrieren, dass dies in den Dokumenten so ist. Alles andere ist völlig irrelevant, daher verstehe ich Ihren Standpunkt nicht. Sie könnten genauso gut tausend Fragen stellen, und es wäre immer noch völlig irrelevant, da dies nicht der Punkt dieser Antwort ist, mit der ich klarstelle, dass ich einverstanden bin.get_object_or_404
und keine bevorzugte Methode, um zu überprüfen, ob Elemente in einem Abfragesatz vorhanden sind. Wenn Sie list () in einem Abfragesatz ausführen, werden alle Objekte in einem Abfragesatz abgerufen. Dies wäre schlimmer, als zweimal abzufragen, wenn viele Zeilen zurückgegeben werden..exists()
ist effizienter, wenn das qs nicht ausgewertet wird.Seit Version 1.2 verfügt Django über QuerySet. existiert () Methode, die am effizientesten ist:
Wenn Sie QuerySet trotzdem evaluieren möchten, ist es besser, Folgendes zu verwenden:
Weitere Informationen finden Sie in der Dokumentation zu QuerySet.exists () .
quelle
.get
gibt kein Abfrageset zurück. Es gibt ein Objekt zurück. Also google dafürWenn Sie eine große Anzahl von Objekten haben, kann dies (manchmal) viel schneller sein:
An einem Projekt, an dem ich mit einer riesigen Datenbank
not orgs
arbeite , sind es mehr als 400 ms und 250 msorgs.count()
. In meinen häufigsten Anwendungsfällen (bei denen Ergebnisse vorliegen) wird diese Technik häufig auf unter 20 ms reduziert. (Ein Fall, den ich gefunden habe, war 6.)Kann natürlich viel länger dauern, je nachdem, wie weit die Datenbank suchen muss, um ein Ergebnis zu finden. Oder noch schneller, wenn es schnell einen findet; YMMV.
BEARBEITEN: Dies ist häufig langsamer als
orgs.count()
wenn das Ergebnis nicht gefunden wird, insbesondere wenn die Bedingung, nach der Sie filtern, selten ist. Daher ist es besonders nützlich in Ansichtsfunktionen, bei denen Sie sicherstellen müssen, dass die Ansicht vorhanden ist, oder Http404 auslösen müssen. (Wo, wie man hoffen würde, Leute nach URLs fragen, die öfter existieren als nicht.)quelle
So überprüfen Sie die Leere eines Abfragesatzes:
oder Sie können nach dem ersten Element in einem Abfragesatz suchen. Wenn es nicht vorhanden ist, wird Folgendes zurückgegeben
None
:quelle
if orgs.exists()
wurde durch eine Antwort abgedeckt , die etwa 5 Jahre vor dieser gegeben wurde. Das einzige, was diese Antwort auf den Tisch bringt, was vielleicht neu ist, istif orgs.first()
. (Auch dies ist umstritten: Unterscheidet es sich wesentlich von demorgs[0]
vor etwa 5 Jahren vorgeschlagenen ?) Sie sollten diesen Teil der Antwort entwickeln: Wann möchte man dies anstelle der anderen zuvor vorgeschlagenen Lösungen tun ?Der effizienteste Weg (vor Django 1.2) ist folgender:
quelle
Ich bin mit dem Prädikat nicht einverstanden
Es sollte sein
Ich hatte das gleiche Problem mit einer ziemlich großen Ergebnismenge (~ 150.000 Ergebnisse). Der Operator ist in QuerySet nicht überladen, daher wird das Ergebnis tatsächlich als Liste entpackt, bevor die Prüfung durchgeführt wird. In meinem Fall hat sich die Ausführungszeit um drei Aufträge verkürzt.
quelle
Sie können auch Folgendes verwenden:
if(not(orgs)): #if orgs is empty else: #if orgs is not empty
quelle