2016-03-26 6 views
0

私は、そのインスタンス毎時間作成するモデルがあります: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) 

機能の実装にはどうすればよいですか?

答えて

2

値を返す以外はすべてを正しく実行しています。集計クエリでは、これは

{'temperature': 202.48803054780439, 
'no2': 4881.734909678366, 
'co': None, 
'humidity': 200} 
のような辞書を返します

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} 

エントリインスタンスではありません

0

ジョブスケジューラを使用していくつかの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 ... 
関連する問題