如何在 Django 中聚合数据?
How to aggregate data in 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)
我应该怎么做才能实现功能?
我建议您可以通过作业调度程序定期执行一些 script.py。 script.py 可能会像这样处理你的 django 项目脱离 django shell;
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 ...
除了 return 价值之外,您做的一切都正确。聚合查询不应是 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}
这将 return 像
这样的字典
{'temperature': 202.48803054780439,
'no2': 4881.734909678366,
'co': None,
'humidity': 200}
我有一个模型,其实例每小时创建一次:
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)
我应该怎么做才能实现功能?
我建议您可以通过作业调度程序定期执行一些 script.py。 script.py 可能会像这样处理你的 django 项目脱离 django shell;
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 ...
除了 return 价值之外,您做的一切都正确。聚合查询不应是 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}
这将 return 像
这样的字典{'temperature': 202.48803054780439,
'no2': 4881.734909678366,
'co': None,
'humidity': 200}