【问题标题】:How to aggregate data in django?如何在 django 中聚合数据?
【发布时间】:2016-03-26 11:56:25
【问题描述】:

我有一个模型,它的实例每小时创建一次:

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)

如何实现功能性?

【问题讨论】:

    标签: python django django-aggregation


    【解决方案1】:

    除了返回值之外,您所做的一切都是正确的。聚合查询不应该是 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}
    

    【讨论】:

      【解决方案2】:

      我建议您可以通过作业调度程序定期执行一些 script.py。 script.py 可能是这样来处理你的 django shell 的 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 ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 2015-12-06
        • 2016-03-23
        • 2019-08-05
        • 2011-01-16
        • 2015-07-27
        • 2011-09-03
        相关资源
        最近更新 更多