的乘法的總和我有一個模型,這樣Django的聚合:兩個字段
class Task(models.Model):
progress = models.PositiveIntegerField()
estimated_days = models.PositiveIntegerField()
有些事情現在我希望做一個計算Sum(progress * estimated_days)
在數據庫級別上。使用Django聚合我可以有每個領域的總和,但不是領域乘法的總和。
的乘法的總和我有一個模型,這樣Django的聚合:兩個字段
class Task(models.Model):
progress = models.PositiveIntegerField()
estimated_days = models.PositiveIntegerField()
有些事情現在我希望做一個計算Sum(progress * estimated_days)
在數據庫級別上。使用Django聚合我可以有每個領域的總和,但不是領域乘法的總和。
更新:爲的Django> = 1.8請遵循@kmmbvnr
提供的答案有可能使用Django ORM:
這裏就是你應該這樣做:
from django.db.models import Sum
total = (Task.objects
.filter(your-filter-here)
.aggregate(
total=Sum('progress', field="progress*estimated_days")
)['total']
)
注:如果這兩個領域是不同類型的,說integer
& float
,要返回應爲Sum
這是一個遲到的回答第一個參數傳遞的類型,但我想它會幫助尋找相同的人。
你有幾種選擇:
progress_X_estimated_days
和更新它保存overwrited方法。然後通過這個新領域進行聚合。的改寫:
class Task(models.Model):
progress = models.PositiveIntegerField()
estimated_days = models.PositiveIntegerField()
progress_X_estimated_days = models.PositiveIntegerField(editable=False)
def save(self, *args, **kwargs):
progress_X_estimated_days = self.progress * self.estimated_days
super(Task, self).save(*args, **kwargs)
是的,我實際上保持原始SQL或附加的屬性作爲最後的選擇。不管怎麼說,多謝拉。 –
使用Django 1.8及以上,您現在可以通過表達您彙總:
from django.db.models import F
Task.objects.aggregate(total=Sum(F('progress') * F('estimated_days')))['total']
常量都還可以,一切都是組合:
from django.db.models import Value
Task.objects.aggregate(total=Sum('progress')/Value(10))['total']
我認爲這個答案更容易理解和維護。除了這些字段的類型不同之外,將'output_field'參數添加到聚合函數 –
這是當前的正確答案。謝謝 –
我試圖在Django的1.7,但我越來越AttributeError'AttributeError:'ExpressionNode'對象沒有屬性'split'',爲什麼版本我的django版本是1.7.10 –
的解決方案取決於Django的版本。
django的< 1.8
from django.db.models import Sum
MyModel.objects.filter(<filters>).aggregate(Sum('field1', field="field1*field2"))
的django> = 1.8
from django.db.models import Sum, F
MyModel.objects.filter(<filters>).aggregate(Sum(F('field1')*F('field2')))
工作得很好,謝謝,但要注意* field * kwarg沒有記錄,並且我沒有在Django測試套件中找到任何關於它的測試。 –
這很酷!它仍然在django 1.7上工作。 – haudoing
「進度」字段的成就是什麼?我試圖找出這段代碼片段,因爲它是完全我需要的 – Maor