es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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"].

Tags:  , ,

Answer

  1. Avatar for 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:

    data = []
    workout = Workout.objects.filter(member=request.user.member)
    for p in workout:
        exercise = p.exercises.aggregate(total=Sum(F('reps') * F('series') * F('weight'))).values()
        for d in exercise:
            data.append(d)
    # calcular la suma de todos los volúmenes de entrenamiento
    total_volume = sum(float(d) for d in data)
    # agregar el volumen total a la lista de datos
    data.append(str(total_volume))
    

    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 de data como una cadena. Ahora, la lista de data contendrá todos los volúmenes de entrenamiento de cada día, así como el volumen total de todos los días.

Comments are closed.