2010-09-25 6 views
6

Tengo una consulta que es básicamente "contar todos los elementos de tipo X y devolver los elementos que existen más de una vez, junto con sus recuentos". En este momento tengo esto:Filtrado en el recuento con el ORM de Django

Item.objects.annotate(type_count=models.Count("type")).filter(type_count__gt=1).order_by("-type_count") 

pero no devuelve nada (el recuento es 1 para todos los elementos). ¿Qué estoy haciendo mal?

Idealmente, debe obtener la siguiente:

Type 
---- 
1 
1 
2 
3 
3 
3 

y regreso:

Type, Count 
----------- 
1  2 
3  3 
+0

¿Puedes mostrar tus modelos? –

+0

Podría, pero lo relevante es que hay un modelo de "Artículo" con un campo "tipo" ... –

Respuesta

15

Para contar el número de apariciones de cada tipo, debe agrupar por el campo type. En Django esto se hace usando values para obtener solo ese campo. Entonces, esto debería funcionar:

Item.objects.values('group').annotate(
    type_count=models.Count("type") 
).filter(type_count__gt=1).order_by("-type_count") 
+0

sí, eso es correcto, pero use 'type' en lugar de' group' :) devolverá algo como: [{'type': u'X ',' type_count ': 2}] - ¿por qué no dije eso? anterior :) – bx2

+0

Creo que querías decir "escriba" allí en lugar de "grupo", * funcionó * cuando hice esto sin la parte __gt, pero con la parte __gt solo arroja "el objeto dict no tiene ningún atributo tipo_count", que me dice que está tratando de acceder a ella como una columna ... –

+0

Eso es extraño, lo he comprobado y funciona como un amuleto. Por cierto. cuando dice sobre no type_count attr en dict significa el dict generado por aggregate, no intenta acceder como una columna. Los resultados deberían ser como los que escribí arriba. Compruébalo en django shell para estar seguro. – bx2

2

Es error lógico;)

type_count__gt=1 significa type_count > 1 lo que si el count == 1 no será se muestra :) use type_count__gte=1 en su lugar - significa type_count >= 1 :)

+0

Solo quiero los que cuentan * más * que uno, así que es correcto ... –

+0

sí pero tú dijo que el recuento es 1 para cada uno, esa es la razón por la que no se muestra nada :) – bx2

+0

Hay tipos duplicados, sin embargo, el recuento de todo es 1. Esto está mal, pero no sé por qué el recuento no es el correcto uno. –

Cuestiones relacionadas