2012-07-07 13 views
7

Ich möchte die Anzahl der in meinem Abfrage-Set zurückgegebenen Elemente zählen. Zum BeispielAnzahl der Elemente im Abfrage-Set ohne Anzahl zählen()

userdesigns = Design.objects.filter (desadder = user.id)

Ich mag die Anzahl des Objekts ohne count) (unter Verwendung zurückgegeben bekommen.

Der Grund ist, dass ich versuche, die Leistung zu beschleunigen und die Anzahl der Datenbankabfragen, die ich durchführen, und ich bemerkte, dass mit count() pingt die Datenbank, die ich nicht will. Wenn ich bedenke, dass ich bereits das komplette lets von userdesigns gezogen habe, sollte es nicht einen Weg geben, nur die Anzahl der Elemente zu zählen, die in diesem zurückgegebenen Abfrage-Set gespeichert sind?

Antwort

16

len(). Ein QuerySet wird ausgewertet, wenn Sie len() darauf aufrufen. Dies liefert erwartungsgemäß die Länge der Ergebnisliste.

Hinweis: Verwenden Sie nicht len ​​() in QuerySets, wenn Sie nur die Anzahl der Datensätze in der Menge bestimmen möchten. Es ist viel effizienter , um eine Zählung auf der Datenbankebene zu behandeln, mit SQL SELECT COUNT (*), und Django bietet eine count() - Methode genau aus diesem Grund. Siehe count() unten. So

Source

, wenn Sie len(userdesigns) rufen statt userdesigns.count() wird django fordern alle dazugehörigen Daten aus der Tabelle in einer einzigen Abfrage. Danach können Sie auf alle Elemente der Variable userdesigns zugreifen, es werden keine weiteren Abfragen durchgeführt.

>>> m = Model1.objects.filter(desadder=1) 
>>> len(m) 
(0.000) SELECT "app1_model1"."id", "app1_model1"."desadder", "app1_model1"."test" FROM "app1_model1" WHERE "app1_model1"."desadder" = 1 ; args=(1,) 
2 
>>> m[0] 
<Model1: Model1 object> 
>>> m = Model1.objects.filter(desadder=1) 
>>> len(m) 
(0.000) SELECT "app1_model1"."id", "app1_model1"."desadder", "app1_model1"."test" FROM "app1_model1" WHERE "app1_model1"."desadder" = 1 ; args=(1,) 
2 
>>> m[0] 
<Model1: Model1 object> 
>>> 
+0

Oh interessant. Du sagst also, dass ich anstatt meine Abfrage oben auszuführen, stattdessen einfach 'len()' von Anfang an verwenden kann und alle Elemente in 'userdesigns' mitgehen werden? – user1328021

+0

Ja. Ich habe ein Beispiel aus der Django-Shell hinzugefügt. –

+1

"Der Grund ist, dass ich versuche, die Leistung zu beschleunigen und die Anzahl der Datenbankabfragen zu reduzieren, die ich ausführe" => dann lerne, 'Queryset.select_related' zu verwenden. –

0

Riateche beantwortet diese, aber wenn Sie nicht len ​​() oder .count() direkt auf dem QuerySet verwenden wollten, könnten Sie eine values_list zurückkehren und len() auf sie aus.

Django Dokumentation sagt:

https://docs.djangoproject.com/en/dev/ref/models/querysets/

A ValuesQuerySet nützlich ist, wenn Sie wissen, dass Sie nur Werte aus einer kleinen Anzahl der verfügbaren Felder müssen gehen und Sie werden nicht brauchen die Funktionalität eines Modellinstanzobjekts.

Ich bezweifle, dass dies schneller ist, aber Sie könnten immer Zeit und sehen. Dies kann nützlich sein, wenn Sie nur eine Teilmenge der insgesamt verfügbaren Felder in einer Tabelle zurückgeben möchten.

Verwandte Themen