有没有办法像这样使用它
Foo.objects.annotate(geometric_mean=GeometricMean('bars__value'))
或者
Foo.objects.annotate(geometric_mean=Power(Prod('bars__value'), Count('bars'))
有没有办法像这样使用它
Foo.objects.annotate(geometric_mean=GeometricMean('bars__value'))
或者
Foo.objects.annotate(geometric_mean=Power(Prod('bars__value'), Count('bars'))
你可以做一些非常相似的事情:你可以计算自然对数的平均值:
from django.db.models import Avg
from django.db.models.functions import Ln
Foo.objects.annotate(geometric_mean=Avg(Ln('bars__value')))
那么几何平均值就是它的指数。如果您真的需要几何平均值本身,那么您可以在该结果上使用Exp
[Django-doc]:
from django.db.models import Avg
from django.db.models.functions import Exp, Ln
Foo.objects.annotate(geometric_mean=Exp(Avg(Ln('bars__value'))))
但是,如果您只想按两个几何平均值排序,则不需要这个,因为指数保持顺序关系不变:e a ≤e b意味着a≤b,反之亦然。
这是因为ln(x 1 ×x 2 ×…×x n )等价于ln(x 1 )+ln(x 2 )+…+ln(x n ),而ln(x y )等价于y× ln(x)。