Saltar al contenido

Django: Agrupar por fecha (día, mes, año)

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *