如何在Django中对对象的两个示例执行数学运算?

50few1ms  于 2022-12-05  发布在  Go
关注(0)|答案(3)|浏览(141)

我想把两个不同物体的两个数相加。
这是一个简化的版本,我有两个整数,我把它们相乘得到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,这可能吗?

dfuffjeb

dfuffjeb1#

好的做法是始终避免模板上的逻辑。最好在视图中循环并将计算值添加到上下文中:

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)
xuo3flqw

xuo3flqw2#

您可以尝试使用aggregate执行此操作

from django.db.models import Sum

ModelA.objects.aggregate(Sum('multiplied'))

如果不适合,您只需在每个field上使用aggregate,然后将它们加在一起。

t1qtbnec

t1qtbnec3#

在模板中,当您对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服务器上,从各种Angular 来看,这几乎总是比在对象上使用函数要快得多。

相关问题