Solución:
Django 1.10 y superior
Listas de documentación de Django extra
como obsoleto pronto. (Gracias por señalar eso @seddonym, @ Lucas03). Abrí un boleto y esta es la solución que proporcionó jarshwah.
from django.db.models.functions import TruncMonth
from django.db.models import Count
Sales.objects
.annotate(month=TruncMonth('timestamp')) # Truncate to month and add to select list
.values('month') # Group By month
.annotate(c=Count('id')) # Select the count of the grouping
.values('month', 'c') # (might be redundant, haven't tested) select month and count
versiones mas antiguas
from django.db import connection
from django.db.models import Sum, Count
truncate_date = connection.ops.date_trunc_sql('month', 'created')
qs = Order.objects.extra({'month':truncate_date})
report = qs.values('month').annotate(Sum('total'), Count('pk')).order_by('month')
Ediciones
- Cuenta agregada
- Información agregada para django> = 1.10
Solo una pequeña adición a la respuesta de @tback: no funcionó para mí con Django 1.10.6 y postgres. Agregué order_by () al final para arreglarlo.
from django.db.models.functions import TruncMonth
Sales.objects
.annotate(month=TruncMonth('timestamp')) # Truncate to month and add to select list
.values('month') # Group By month
.annotate(c=Count('id')) # Select the count of the grouping
.order_by()
Otro enfoque es utilizar ExtractMonth
. Tuve problemas al usar TruncMonth debido a que solo se devolvió un valor de año de fecha y hora. Por ejemplo, solo se devolvieron los meses de 2009. ExtractMonth solucionó este problema perfectamente y se puede usar como se muestra a continuación:
from django.db.models.functions import ExtractMonth
Sales.objects
.annotate(month=ExtractMonth('timestamp'))
.values('month')
.annotate(count=Count('id'))
.values('month', 'count')
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)