如何在django中对计算变量求和?

时间:2018-06-11 18:45:58

标签: django django-models

我无法找到以下简单问题的解决方案。以下命令

tenta_data = Konstruktion.objects.all().annotate(tid=Sum(F('antal')))
如果antal是数据库中的变量,

工作正常:

class Konstruktion(models.Model):
    antal = models.FloatField()
    .... 
    def anumber(self):
       return .....

但是如果我要总结一下,我该怎么办?这是一个功能。

2 个答案:

答案 0 :(得分:0)

数据库没有关于函数,属性等的知识。这意味着它不能自动化这项任务。

您可以这样做的唯一方法是在 Python 级别计算它,例如:

total_anumbers = sum(
    k.anumber()
    for k in Konstruktion.objects.all()
)

这将sum(..)通过迭代Konstruktion个对象进行上升,并且每次计算k.anumber()并将它们相加。

请注意,Python总和与Python等效的略有不同。例如,会忽略NULL / None值。此外,它可以将不同类型的对象添加到一起(例如bool s与int s等,只要实现这样的添加,就可以了。)

其他更高级的聚合通常更难以在Python级别模仿

答案 1 :(得分:0)

@Willem Van Onsem所述,您无法聚合模型属性/函数。但是,你可以在下面注释它们(如果函数做了一些简单的数学运算)
因此,我假设函数返回两个字段的总和,

class Konstruktion(models.Model):
    antal = models.FloatField()
    second_field = models.FloatField()

    def anumber(self):
        return self.antal + self.second_field


然后聚合如下,

from django.db.models import F, Sum

Konstruktion.objects.annotate(sum=F('antal') + F('second_field')).aggregate(Sum('sum'))