2012-07-07 24 views
7

Vorrei contare il numero di elementi restituiti nel mio set di query. Per esempioCome contare il numero di elementi in queryset senza contare()

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

mi piacerebbe ottenere il numero di oggetti restituiti senza utilizzare count().

Il motivo è che sto cercando di accelerare le prestazioni e ridurre il numero di query di database che eseguo e ho notato che l'utilizzo di count() esegue il ping del database, che non desidero. Considerando che ho già tirato fuori la completa gamma di userdesigns, non dovrebbe esserci un modo per contare il numero di elementi memorizzati in quel queryset restituito?

risposta

16

len(). Un QuerySet viene valutato quando si chiama len() su di esso. Questo, come ci si potrebbe aspettare, restituisce la lunghezza della lista dei risultati.

Nota: non utilizzare len() su QuerySets se tutto ciò che si vuole fare è determinare il numero di record nel set. È molto più efficiente gestire un conteggio a livello di database, utilizzando SQL SELECT COUNT (*), e Django fornisce un metodo count() proprio per questo motivo. Vedere conteggio() di seguito.

Source

Quindi, se si chiama len(userdesigns) invece di userdesigns.count(), Django richiedere tutti i dati correlati dalla tabella in una singola query. Dopo di che è possibile accedere a tutti gli elementi della variabile userdesigns, non verranno effettuate ulteriori query.

>>> 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 interessante. Quindi stai dicendo che invece di eseguire la mia query qui sopra, invece, posso semplicemente usare 'len()' dal get-go e tutti gli elementi in 'userdesigns' arriveranno per la corsa? – user1328021

+0

Sì. Ho aggiunto un esempio della shell di django. –

+1

"Il motivo è che sto cercando di accelerare le prestazioni e ridurre il numero di query del database che eseguo" =>, quindi impara a usare anche "Queryset.select_related'. –

0

Riateche rispose a questa, ma se non si desidera utilizzare len() o .count() direttamente sul QuerySet, si potrebbe restituire un values_list e utilizzare len() su di esso.

documentazione Django dice:

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

Un ValuesQuerySet è utile quando sai che stai solo andando ad avere bisogno valori da un piccolo numero di campi disponibili e non avrete bisogno la funzionalità di un oggetto di istanza del modello.

dubito che questo sia più veloce, ma si potrebbe sempre cronometrare e vedere. Potrebbe essere utile se si desidera solo restituire un sottoinsieme dei campi disponibili totali in una tabella.

Problemi correlati