django在聚合期间对字段执行逻辑(而不是直接执行聚合(Sum('somefield')))

时间:2013-03-16 13:23:46

标签: python django

代码:

MyModel(models.Model):
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    name = models.CharField()
    somenum = models.IntegerField()

如果我想计算所有'somenum'(上面模型中的最后一个字段)的总和,那么我可以这样做:

queryset.aggregate(Sum('somenum'))

我的要求:

(enddate-startdate)的总和(表示结果为天数),不包括(星期六和星期日)。

我可以使用普通逻辑来做到这一点,但我认为聚合或其他方式是首选。

我知道的方式:

  1. 循环查询集的每个记录,计算每条记录的天数(不包括星期六,星期日),并在循环期间求和(如循环前的sum = 0,循环内部总和+ = current_value;)。
  2. 保存模型时写入执行此计算(sum)的信号,并将计算值保存到UserProfile。当我们想要价值时,我们可以从UserProfile获得它,但我认为这个过程是错误的。
  3. 为上面显示的MyModel添加另一个字段'num_of_days',每当保存模型时,信号应执行计算并应保存该字段。然后我们可以使用queryset.aggregate(Sum('num_of_days'))。

1 个答案:

答案 0 :(得分:1)

  1. 每当你想要这些数据时,你必须查询所有MyModel并在python中求和;这不是有效的或可扩展的。
  2. 为什么您要保存到UserProfile似乎天数属于MyModel
  3. 我认为这应该是首选方法。它简单,优雅,易于操作。通过这样做,您将聚合放在数据库上