Как агрегировать данные в django?

У меня есть модель, экземпляр которой создается каждый час:

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

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

Я хочу получить средние значения за дни прошлого месяца, например. 30 экземпляров, содержащих среднее значение за каждый день. Как это реализовать? Теперь я написал этот метод:

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)

Что я должен сделать, чтобы реализовать функциональность?


person Vassily    schedule 26.03.2016    source источник


Ответы (2)


Вы все делаете правильно, кроме возврата значения. Совокупный запрос не должен быть экземпляром Entry.

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}

Это вернет дикт, как

{'temperature': 202.48803054780439,
 'no2': 4881.734909678366,
 'co': None,
 'humidity': 200}
person Andrey Nelubin    schedule 26.03.2016

Я предлагаю вам регулярно запускать скрипт script.py через планировщик заданий. script.py может быть таким, чтобы иметь дело с вашим проектом django вне оболочки django;

import sys, os

PATH_TO_DJANGO = 'path/to/django/project'
sys.path.append(PATH_TO_DJANGO)
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'

from app import Entry # can be imported after the above config...
import average_for_period # your custom function

# do what you want to ...
person Leonard2    schedule 26.03.2016