Sum с использованием синтаксиса шаблонов Django?

У меня есть упражнение, состоящее из сетов, я назначаю сеты этой модели упражнения. Я могу рассчитать общий объем одного сета. Но как мне вычислить общий объем для всего упражнения. Можно ли вернуть значение суммы в цикле for? Когда я делаю это в представлении, я могу вернуть только сумму .all() вот так

def homeview(request):
    set = ExerciseSetModel.objects.all()
    sum = 0
    for obj in set:
        sum += obj.setvolume()

    context = {
        'sum': sum, # returns the sum of everything but I want the single exercise
    }

    return TemplateResponse(request, 'poststemplates/posthome.html', context)

модель:

class ExerciseModel(models.Post):
    exercisename = models.TextField(max_length=500, verbose_name='text',
                                blank=True, null=True, default="text")

class ExerciseSetModel(models.Post):
    exercise = models.ForeignKey(ExerciseModel, on_delete=models.CASCADE, default=None,)
    repsnumber = models.IntegerField(default=1, null=True, blank=True)
    weightnumber = models.IntegerField(default=1, null=True, blank=True)

    def setvolume(self):
    return self.repsnumber * self.weightnumber

Просмотров:

@login_required
def homeview(request):

    exercises = ExerciseModel.objects.all()

    context = {
        'exercises': exercises,
    }
    return TemplateResponse(request, 'poststemplates/posthome.html', context)

template:

{% for exercise in exercises %}
  {% for set in exercise.exercisesetmodel_set.all %}
    {{set.setvolume}}
  {% endfor %}
{% endfor %}

Теперь допустим, что у меня есть два набора в одном упражнении, я могу вычислить set volume для каждого set, но как мне вычислить exercise volume для всего exercise esentially вычисляя setvolume 1 + setvolume 2 складывая каждую итерацию в for loop

Как насчет этих?

Вариант 1: Вычисление общей суммы в представлениях и передача словаря {exercise.id:total_sum} в шаблон

views.py

def homeview(request):

    exercises = ExerciseModel.objects.all()
    total_sum_by_exercise = {}
    for exercise in exercises:
        sets = ExerciseSetModel.objects.filter(exercise=exercise).all()
        sum_all_sets = 0
        for obj in sets:
            sum_all_sets += obj.setvolume()
        total_sum_by_exercise[exercise.id] = sum_all_sets

    context = {
        'exercises': exercises, 'total_sum_by_exercise': total_sum_by_exercise
    }
    return TemplateResponse(request, 'poststemplates/posthome.html', context)

posthome.html

{% for exercise in exercises %}

  {% for set in exercise.exercisesetmodel_set.all %}
    {{set.setvolume}}
  {% endfor %}

  {% for key, val in total_sum_by_exercise.items %}
    {% if key == exercise.id%}
      {{val}}
    {% endif %}

  {% endfor %}
{% endfor %}

Вариант 2: Определение метода для вычисления общей суммы в модели и вызов этого метода в шаблоне

models.py

class ExerciseModel(models.Model):
    exercisename = models.TextField(max_length=500, verbose_name='text', blank=True, null=True, default="text")

    def total_sum(self):
        sets = ExerciseSetModel.objects.filter(exercise=self.id).all()
        sum_all_sets = 0
        for obj in sets:
            sum_all_sets += obj.setvolume()
        return sum_all_sets

class ExerciseSetModel(models.Model):
    exercise = models.ForeignKey(ExerciseModel, on_delete=models.CASCADE, default=None,)
    repsnumber = models.IntegerField(default=1, null=True, blank=True)
    weightnumber = models.IntegerField(default=1, null=True, blank=True)

    def setvolume(self):
        return self.repsnumber * self.weightnumber

posthome.html

{% for exercise in exercises %}

  {% for set in exercise.exercisesetmodel_set.all %}
    {{set.setvolume}}
  {% endfor %}
  
  {{exercise.total_sum}}

{% endfor %}
Вернуться на верх