在Django中,如何多重聚合一个字段?

8e2ybdfx  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(111)

我想用乘法来聚合一个字段,但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函数,这就意味着它很琐碎,但我不能把我的手指放在它上面。

ars1skjm

ars1skjm1#

Django聚合函数通常可以被翻译成相应的SQL短语,因此结果将是一个SQL查询。SQL有AVGSUM,但没有PRODUCTWhy is there no PRODUCT aggregate function in SQL?)。其中一个原因可能是溢出的危险。如果你开始将更小的数字相乘,你可以很快得到非常大的值。
因此,如果计算无论如何都要在Python中进行(而不是SQL引擎中的SQL),那么你可以这样做:

import numpy as np

ratios = MyModel.objects.filter(ratio__lte=10).values_list("ratio", flat=True)
mys = np.prod(ratios)

字符串
有些人可能会尝试用SELECT exp(SUM(LOG(price))) FROM products;类型的数学技巧来实现一个产品Django聚合,但是使用指数和对数函数来总结一个产品听起来像是在浪费计算资源。如果可能的话,我喜欢把东西保持在SQL级别(这样引擎也可以优化),但是也许这是一个例子,把它带到Python是有意义的?

相关问题