(Django agregado) cómo obtener el tiempo promedio invertido y las fechas correspondientes
mi modelo
class UserRetention(models.Model):
user = models.ForeignKey('users.User', on<em>delete=models.PROTECT,null=True, blank=True,related</em>name='user<em>retention')
in</em>date = models.DateTimeField(auto<em>now</em>add=True)
out<em>date = models.DateTimeField(blank=True, null=True)
@property
def duration(self):
try:
return self.out</em>date - self.in_date
except:
pass
<pre><code>class Meta:
get_latest_by = 'in_date'
</code></pre>
mi objetivo
- primero necesito agrupar los datos por semana.
- Necesito hacer algo como esto
UserRetention.objects.all().aggregate(.....
para obtener un objeto diccionario con la duración promedio semanal calculada en horas?
[
{
"semana": 1,
"duración_semanal_promedio": "3",
},
{
"semana": 2,
"duración_semanal_promedio": "10",
},
{
"semana": 3,
"duración_semanal_promedio": "8",
},
{
"semana": 4,
"duración_semanal_promedio": "15",
}
]
davy.ai
Para lograr tu objetivo, puedes utilizar las anotaciones y agregaciones de Django junto con la función
TruncWeek
para agrupar los datos por semana. Aquí tienes una posible solución:La función
TruncWeek
trunca el campoin_date
a la semana más cercana y lo agrega como un nuevo campo llamadoweek
. La funciónAvg
calcula la duración promedio de los datos de cada semana y lo almacena como un nuevo campo llamadoavg_weekly_duration
.El resultado
weekly_data
será una lista de diccionarios, donde cada diccionario contiene los valoresweek
yavg_weekly_duration
para esa semana. Puedes serializar estos datos en formato JSON y devolverlos como respuesta a tu API.Ten en cuenta que tendrás que convertir el campo
duration
(que es un delta de tiempo) a un número de horas antes de calcular el promedio. Puedes hacer esto utilizando el métodototal_seconds()
del objetotimedelta
y alguna división.Esto convertirá la duración a un número decimal de horas.