Python Django:将计算结果存储在数据库读数上

Python Django:将计算结果存储在数据库读数上,python,django,Python,Django,我正在写一个应用程序来控制不同水表的用水量。简化一下,我可以得到每15分钟每米消耗量的读数列表。我有一个返回如下内容的查询: Date | ReadingPoint | Consumption -----------------+--------------+------------ 03/05/2014 02:00 | 1 | 12 03/05/2014 02:00 | 2 | 12 03/05/2014 02:15 | 1

我正在写一个应用程序来控制不同水表的用水量。简化一下,我可以得到每15分钟每米消耗量的读数列表。我有一个返回如下内容的查询:

Date             | ReadingPoint | Consumption
-----------------+--------------+------------
03/05/2014 02:00 | 1            | 12
03/05/2014 02:00 | 2            | 12
03/05/2014 02:15 | 1            | 7
03/05/2014 02:15 | 2            | 7
03/05/2014 02:30 | 1            | 11
03/05/2014 02:30 | 2            | 11
03/05/2014 02:45 | 1            | 23
03/05/2014 02:45 | 2            | 23
....
我需要定期存储这些读数的一些预计算。一些例子:

  • 储存每天的总消耗量
  • 存储每天的最大读数
  • 储存月平均消耗量
这种计算是用户定义的,所以我不确定如何对此进行建模。这个预先计算的表将被集中查询,因此我认为理想的方法是将每个计算存储在不同的表中,但我不确定django是否可以创建这种动态模型

下面是我的问题:

  • 我确信有工具可以做这类事情,但我以前从未需要做过,我希望避免几天或几周的研究和测试。是否有任何“标准”方法来实现这种行为

  • 为了启动进行预计算的过程,我考虑使用芹菜。这是一个正确的选择吗


一个通用计算表怎么样

computation_id         | key                       | value
-----------------------+---------------------------+---------
monthly_average        | "reading_point_id+month"  | 1.2
weekly_maximum         | "reading_point_id+week"   | 9
monthly_global_maximum | "month"                   | 12
密钥格式将与用户定义的计算一起定义。 计算id和标识符将是您的复合主键。 计算id可以是一个数字字段(这样可以更快地查找索引)

尽管有一张大桌子,但我怀疑表演会相当不错


我希望我没有误解您的要求。

您是否考虑过使用简单的键值缓存系统,如Redis或Memcached?您可以在缓存中动态存储所有值。如果需要重新计算,可以重建缓存。但除此之外,如果您只需要值和快速查找,那么缓存就可以正常工作。如果不知道您的查询将是什么样子,建议对数据库表进行任何优化可能为时过早

如果缓存对您来说太早,您还可以编写自己的ModelManager方法来动态计算和存储值

class WaterMeterManager(models.Manager):
  def pre_calculate(self):
    return self.get_query_set().aggregate(Avg('value'), Max('value'), Min('value'), Sum('value'))

class WaterMeter(models.Model):
    objects = WaterMeterManager()
您可以将其用作:

WaterMeter.objects.pre_calculate().get('value__min')

非常感谢。我喜欢这种方法,尽管生成/解码计算出的id可能会很麻烦。在接受你的答案之前,让我先测试一下。有什么简单的方法重建缓存吗?