python - select_related - Django GROUP BY formato de fecha strftime
django values aggregate (4)
Cualquier razón para no hacer esto en la base de datos, ejecutando la siguiente consulta en la base de datos:
select date, sum(numbers_data)
from my_model
group by date;
Si su respuesta es, la fecha es una fecha con horas, minutos, segundos o milisegundos distintos de cero, mi respuesta es usar una función de fecha para truncar la fecha y hora, pero no puedo decir exactamente qué es eso sin saber qué RBDMS que estás usando
Me gustaría hacer una SUM en filas en una base de datos y grupo por fecha.
Estoy intentando ejecutar esta consulta SQL usando agregados y anotaciones de Django:
select strftime(''%m/%d/%Y'', time_stamp) as the_date, sum(numbers_data)
from my_model
group by the_date;
Intenté lo siguiente:
data = My_Model.objects.values("strftime(''%m/%d/%Y'',
time_stamp)").annotate(Sum("numbers_data")).order_by()
pero parece que solo puede usar nombres de columna en la función de valores (); no le gusta el uso de strftime ().
¿Cómo debo ir sobre esto?
Esto funciona para mí:
select_data = {"d": """strftime(''%%m/%%d/%%Y'', time_stamp)"""}
data = My_Model.objects.extra(select=select_data).values(''d'').annotate(Sum("numbers_data")).order_by()
Necesité un poco para descubrir que tenía que escapar de los signos%.
No estoy seguro acerca de strftime, mi solución a continuación está usando sql postgres trunc ...
select_data = {"date": "date_trunc(''day'', creationtime)"}
ttl = ReportWebclick.objects.using(''cms'')/
.extra(select=select_data)/
.filter(**filters)/
.values(''date'', ''tone_name'', ''singer'', ''parthner'', ''price'', ''period'')/
.annotate(loadcount=Sum(''loadcount''), buycount=Sum(''buycount''), cancelcount=Sum(''cancelcount''))/
.order_by(''date'', ''parthner'')
- igual a la ejecución de consultas sql:
select date_trunc(''month'', creationtime) as date, tone_name, sum(loadcount), sum(buycount), sum(cancelcount) from webclickstat group by tone_name, date;
A partir de v1.8, puede usar expresiones Func () .
Por ejemplo, si se dirige a las funciones de fecha y hora de AWS Redshift:
from django.db.models import F, Func, Value
def TimezoneConvertedDateF(field_name, tz_name):
tz_fn = Func(Value(tz_name), F(field_name), function=''CONVERT_TIMEZONE'')
dt_fn = Func(tz_fn, function=''TRUNC'')
return dt_fn
Entonces puedes usarlo así:
SomeDbModel.objects /
.annotate(the_date=TimezoneConvertedDateF(''some_timestamp_col_name'',
''America/New_York'')) /
.filter(the_date=...)
o así:
SomeDbModel.objects /
.annotate(the_date=TimezoneConvertedDateF(''some_timestamp_col_name'',
''America/New_York'')) /
.values(''the_date'') /
.annotate(...)