查询集的加权平均值 - Django

Mad*_*ham 3 python django

如何尽快从查询集中获取加权平均值。是否可以不使用循环。下面是一个例子。

\n

我的模型.py:

\n
class Product(models.Model):\n    price = models.DecimalField(max_digits=15, decimal_places=2)\n    weighted = models.IntegerField()\n    day = models.IntegrField()\n
Run Code Online (Sandbox Code Playgroud)\n

在我的数据库中,第一天有以下值 \xe2\x80\x8b\xe2\x80\x8b:

\n
Object ID I: Price=100, weighted=12, day=1\nObject ID II: Price=50, weighted=1, day=1\nObject ID III: Price=75, weighted=3, day=1\n
Run Code Online (Sandbox Code Playgroud)\n

如何计算第一天的加权平均值?

\n
day_1_average_weighted = Product.objects.filter(day=1) ???how to get a weighted average - 71.88???\n
Run Code Online (Sandbox Code Playgroud)\n

Wil*_*sem 5

您可以通过以下方式实现:

from django.db.models import F, Sum

Product.objects.filter(day=1).aggregate(
    weighted_sum=Sum(F('weighted') * F('price')) / Sum('weighted')
)
Run Code Online (Sandbox Code Playgroud)

这将返回一个包含一项的字典:weighed_sum将包含加权和。

例如:

>>> Product.objects.create(weighted=9, price=2, day=1)
<Product: Product object (1)>
>>> Product.objects.create(weighted=1, price=5, day=1)
<Product: Product object (2)>
>>> Product.objects.filter(day=1).aggregate(
...     weighted_sum=Sum(F('weighted') * F('price')) / Sum('weighted')
... )
{'weighted_sum': Decimal('2.300000')}
Run Code Online (Sandbox Code Playgroud)