¿Cómo hacer la suma de valores de diferentes objetos en Django?
Quiero calcular el volumen de entrenamiento de cada usuario y luego agregarlo para poder usar el valor en chart.js.
Esto se calcula multiplicando las reps
, series
y peso
de todos los ejercicios en todos los entrenamientos que un usuario tenga.
Tengo los siguientes modelos:
class Exercise(models.Model):
exercise = models.CharField(max_length=166)
series = models.IntegerField(null=True, validators=[RegexValidator(r'^[0-9]*$')])
reps = models.IntegerField(null=True, validators=[RegexValidator(r'^[0-9]*$')])
peso = models.DecimalField(max_digits=5, decimal_places=1, null=True, blank=True)
class Workout(models.Model):
miembro = models.ForeignKey(Member, on_delete=models.CASCADE)
dia = models.CharField(max_length=1, blank=True, null=True, verbose_name="Días")
ejercicios = models.ManyToManyField(Exercise, blank=True)
Para calcular el volumen de entrenamiento, utilicé lo siguiente en las vistas:
datos = []
entrenamiento = Workout.objects.filter(miembro=request.user.member)
for p in entrenamiento:
ejercicio = p.ejercicios.aggregate(total=Sum(F('reps') * F('series') * F('peso'))).values()
for d in ejercicio:
datos.append(d)
Esto devuelve la suma de cada día individualmente. Entonces, si un usuario tiene 2 entrenamientos, devolverá (por ejemplo) ["4350.0", "7350.0"]
¿Cómo puedo calcular la suma de todos los días? Entonces, en el caso de este ejemplo, el valor final sería ["11700.0"]
.
davy.ai
Para calcular la suma de todos los días de entrenamiento, simplemente se puede usar la función incorporada
sum()
de Python. Aquí está el código actualizado con comentarios que explican los cambios:Este código calcula el volumen total de entrenamiento usando la función
sum()
en una expresión generadora que convierte las cadenas de volumen de entrenamiento en flotantes. El resultado se agrega a la lista dedata
como una cadena. Ahora, la lista dedata
contendrá todos los volúmenes de entrenamiento de cada día, así como el volumen total de todos los días.