site pelicula latest descargar python django

python - pelicula - Django equivalente para contar y agrupar por



django windows (4)

¿Cómo es esto? (Que no sea lento)

counts= [ (c, Item.filter( category=c.id ).count()) for c in Category.objects.all() ]

Tiene la ventaja de ser corto, incluso si alcanza muchas filas.

Editar.

La única versión de consulta. Por cierto, esto a menudo es más rápido que SELECT COUNT (*) en la base de datos. Pruébalo para ver.

counts = defaultdict(int) for i in Item.objects.all(): counts[i.category] += 1

Tengo un modelo que se ve así:

class Category(models.Model): name = models.CharField(max_length=60) class Item(models.Model): name = models.CharField(max_length=60) category = models.ForeignKey(Category)

Quiero seleccionar conteo (solo el recuento) de elementos para cada categoría, por lo que en SQL sería tan simple como esto:

select category_id, count(id) from item group by category_id

¿Hay un equivalente de hacer esto "el camino de Django"? ¿O es simple SQL la única opción? Estoy familiarizado con el método count () en Django, sin embargo, no veo cómo encajaría el grupo por allí.


( Actualización : la compatibilidad con la agregación ORM completa ahora se incluye en Django 1.1 . Fiel a la advertencia a continuación sobre el uso de API privadas, el método documentado aquí ya no funciona en las versiones posteriores a 1.1 de Django. No he buscado para averiguar por qué; si está en 1.1 o posterior, debería usar la API de agregación real de todos modos).

El soporte de agregación núcleo ya estaba allí en 1.0; simplemente no está documentado, no es compatible y aún no cuenta con una API amigable. Pero así es cómo puede usarlo de todos modos hasta que llegue 1.1 (bajo su propio riesgo, y con pleno conocimiento de que el atributo query.group_by no es parte de una API pública y podría cambiar):

query_set = Item.objects.extra(select={''count'': ''count(1)''}, order_by=[''-count'']).values(''count'', ''category'') query_set.query.group_by = [''category_id'']

Si luego itera sobre query_set, cada valor devuelto será un diccionario con una clave de "categoría" y una clave de "conteo".

No tiene que hacer un pedido por -count aquí, solo está incluido para demostrar cómo se hace (tiene que hacerse en la llamada .extra (), no en otra parte de la cadena de construcción de queryset). Además, podría decir count (id) en lugar de count (1), pero este último puede ser más eficiente.

Tenga en cuenta también que al establecer .query.group_by, los valores deben ser nombres de columna DB reales (''category_id'') no nombres de campo Django (''categoría''). Esto se debe a que está ajustando las consultas internas en un nivel donde todo está en términos de DB, no en términos de Django.


Aquí, como acabo de descubrir, es cómo hacer esto con la API de agregación Django 1.1:

from django.db.models import Count theanswer = Item.objects.values(''category'').annotate(Count(''category''))


Dado que estaba un poco confundido acerca de cómo funciona la agrupación en Django 1.1, pensé en elaborar aquí cómo utilizarlo exactamente. Primero, repetir lo que dijo Michael:

Aquí, como acabo de descubrir, es cómo hacer esto con la API de agregación Django 1.1:

from django.db.models import Count theanswer = Item.objects.values(''category'').annotate(Count(''category''))

Tenga en cuenta también que debe hacerlo from django.db.models import Count !

Esto seleccionará solo las categorías y luego agregará una anotación llamada category__count . Según el orden predeterminado, esto puede ser todo lo que necesita, pero si el orden predeterminado utiliza un campo que no sea la category esto no funcionará . La razón de esto es que los campos necesarios para realizar el pedido también se seleccionan y hacen que cada fila sea única, por lo que no se agruparán las cosas como se desee. Una manera rápida de arreglar esto es restablecer el orden:

Item.objects.values(''category'').annotate(Count(''category'')).order_by()

Esto debería producir exactamente los resultados que desea. Para establecer el nombre de la anotación, puede usar:

...annotate(mycount = Count(''category''))...

Luego tendrá una anotación llamada mycount en los resultados.

Todo lo demás sobre la agrupación fue muy sencillo para mí. Asegúrese de consultar la API de agregación de Django para obtener información más detallada.