我想把两个不同对象中的两个数字相加。
这里是一个简化的版本。我有两个整数,我把它们相乘得到multiplied
models.py:
class ModelA(models.Model):
number_a = models.IntegerField(default=1, null=True, blank=True)
number_b = models.IntegerField(default=1, null=True, blank=True)
def multiplied(self):
return self.number_a * self.number_b
views.py:
@login_required
def homeview(request):
numbers = ModelA.objects.all()
context = {
'numbers': numbers,
}
return TemplateResponse...
我要做的基本上是模板中的multiplied + multiplied
,但我根本不知道如何做到这一点,因为我首先要循环遍历对象。
因此,如果我有ModelA
和two 'multiplied' values of 100
的两个实例,我想在模板中显示200
。这可能吗?
最好的做法总是避免在模板上使用逻辑。最好在视图处循环并将计算值添加到context:
def homeview(request):
queryset = ModelA.objects.all()
multipliers_addition = 0
for obj in queryset:
multipliers_addition += obj.multiplied()
context = {
'addition': multipliers_addition,
}
return render(request, 'multiply.html', context)
您可以尝试使用aggregate
from django.db.models import Sum
ModelA.objects.aggregate(Sum('multiplied'))
如果不适合,只需在每个field
上使用aggregate
,然后将它们加在一起。
在您的模板中,当您对numbers
变量执行forloop时,您可以直接访问属性,函数和属性。
所以要访问你想要的值,我猜它应该是这样的,简化:
{% for number in numbers %}
{{ number.multiplied }}
{% endfor %}
希望你明白?
但是,请注意这不是最有效的方法。
我们可以让Django请求SQL服务器来做计算方面的繁重工作,所以如果你想要真正聪明并优化你的视图,你可以注释掉你的multiplied
函数并替换它,你仍然可以像我上面描述的那样在模板中访问它,但是我们需要稍微改变一下视图中的代码,像这样:
numbers = ModelA.objects.aggregate(Sum('number_a', 'number_b'))
在haduki的回答中描述得很松散。这将通过创建一个使用SUM
SQL数据库函数的SQL查询来将计算转移给SQL服务器,无论出于什么目的,它几乎总是比在对象上使用函数要快得多。