Edited (after Django 1.8)
Since Django 1.8, you can use F
:
from django.db.models import F. Sum
total = (
Task
.objects
.aggregate(total=Sum(F('progress') * F('estimated_days')))
['total']
)
Old answer (before Django 1.8)
This answer was wrote on 2012 and django 1.8 was published on 2015
Do you have several options:
- Raw query
- Emulbreh's undocumented approach
- Create a third field
progress_X_estimated_days
and update it in save overwrited method. Then do aggregation through this new field.
Overwriting:
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)