如何在Django中对两个对象实例执行数学操作?



我想把两个不同对象中的两个数字相加。

这里是一个简化的版本。我有两个整数,我把它们相乘得到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,但我根本不知道如何做到这一点,因为我首先要循环遍历对象。

因此,如果我有ModelAtwo '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的回答中描述得很松散。这将通过创建一个使用SUMSQL数据库函数的SQL查询来将计算转移给SQL服务器,无论出于什么目的,它几乎总是比在对象上使用函数要快得多。

相关内容

  • 没有找到相关文章

最新更新