Search code examples
pythondjangodjango-aggregation

How to aggregate data in django?


I have model whose instance creating every hour:

class Entry(models.Model):
    class Meta:
        ordering = ['time']

    time = models.DateTimeField()
    no2 = models.FloatField()
    co = models.FloatField()
    humidity = models.FloatField()
    temperature = models.FloatField()

I want to get average values for days of last month e.g. 30 instances containing average value for every day. How to realize it? Now I've wrote this method:

def average_for_period(self, start, end):
        entries_for_period = Entry.objects.filter(time__gte=start, time__lte=end)
        average_value = entries_for_period.aggregate(Avg('temperature'), Avg('no2'), Avg('co'), Avg('humidity'))
        return Entry(**average_value)

What should I do to implement funcionality?


Solution

  • You're doing everything right except returning value. Aggregated query shouldn't be an Entry instance

    avg_values = ['temperature', 'no2', 'co', 'humidity']
    average_value = entries_for_period.aggregate(*[Avg(x) for x in avg_values])
    return {x:average_value['%s__avg' % x] for x in avg_values}
    

    This will return a dict like

    {'temperature': 202.48803054780439,
     'no2': 4881.734909678366,
     'co': None,
     'humidity': 200}