我想用乘法来聚合一个字段,但Django的聚合函数中显然没有Product
函数。
我想做的示例
# models.py
class MyModel(models.Model):
ratio = models.DecimalField(...)
# views.py
mys = MyModel.objects.filter(...).aggregate(cum_ratio=Product(ratio))
字符串
如何做到这一点呢?
我觉得既然Django没有像Sum
那样包含Product
函数,这就意味着它很琐碎,但我不能把我的手指放在它上面。
1条答案
按热度按时间ars1skjm1#
Django聚合函数通常可以被翻译成相应的SQL短语,因此结果将是一个SQL查询。SQL有
AVG
或SUM
,但没有PRODUCT
(Why is there no PRODUCT aggregate function in SQL?)。其中一个原因可能是溢出的危险。如果你开始将更小的数字相乘,你可以很快得到非常大的值。因此,如果计算无论如何都要在Python中进行(而不是SQL引擎中的SQL),那么你可以这样做:
字符串
有些人可能会尝试用
SELECT exp(SUM(LOG(price))) FROM products;
类型的数学技巧来实现一个产品Django聚合,但是使用指数和对数函数来总结一个产品听起来像是在浪费计算资源。如果可能的话,我喜欢把东西保持在SQL级别(这样引擎也可以优化),但是也许这是一个例子,把它带到Python是有意义的?