2012-07-07 35 views
7

Me gustaría contar el número de elementos devueltos en mi conjunto de preguntas. Por ejemploCómo contar el número de elementos en el conjunto de consulta sin contar()

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

me gustaría obtener el número de objeto devuelto sin usando count().

La razón es que estoy tratando de acelerar el rendimiento y reducir el número de consultas de bases de datos que realizo y noté que el uso de count() pings la base de datos, que no quiero. Teniendo en cuenta que ya saqué los permisos completos de los diseños de usuario, ¿no debería existir una forma de simplemente contar la cantidad de elementos almacenados en ese conjunto de respuestas devuelto?

Respuesta

16

len(). Un QuerySet se evalúa cuando llama a len() en él. Esto, como era de esperar, devuelve la longitud de la lista de resultados.

Nota: No use len() en QuerySets si todo lo que quiere hacer es determinar el número de registros en el conjunto. Es mucho más eficiente manejar un conteo en el nivel de la base de datos, usando SQL's SELECT COUNT (*), y Django proporciona un método count() precisamente por esta razón. Consulte recuento() a continuación.

Source

Por lo tanto, si se llama a len(userdesigns) en lugar de userdesigns.count(), Django solicitar todos los datos relacionados de la tabla en una sola consulta. Después de eso puede acceder a todos los elementos de la variable userdesigns, no se realizarán consultas adicionales.

>>> 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 interesante. Entonces, ¿está diciendo que en lugar de ejecutar mi consulta anterior, en su lugar puedo usar 'len()' desde el principio y todos los elementos en 'userdesigns' vendrán para el viaje? – user1328021

+0

Sí. He agregado un ejemplo de django shell. –

+1

"La razón es que estoy tratando de acelerar el rendimiento y reducir el número de consultas a la base de datos que realizo" => y luego aprender a usar 'Queryset.select_related' también. –

0

Riateche respondió esto, pero si usted no desea utilizar len() o .count() directamente en el QuerySet, que podría devolver un values_list y utilizar len() sobre ella.

documentación de Django dice:

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

Un ValuesQuerySet es útil cuando se sabe que sólo va a necesitar valores de un pequeño número de los campos disponibles y no será necesario la funcionalidad de un objeto ejemplar modelo.

Dudo que esto sea más rápido, pero siempre se puede medir el tiempo y ver. Podría ser útil si solo desea devolver un subconjunto del total de campos disponibles en una tabla.

Cuestiones relacionadas