我无法找到以下简单问题的解决方案。以下命令
tenta_data = Konstruktion.objects.all().annotate(tid=Sum(F('antal')))
如果antal是数据库中的变量,工作正常:
class Konstruktion(models.Model):
antal = models.FloatField()
....
def anumber(self):
return .....
但是如果我要总结一下,我该怎么办?这是一个功能。
答案 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'))