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 %}