gpt4 book ai didi

Django - 按组注释加权平均值

转载 作者:行者123 更新时间:2023-12-02 09:59:21 26 4
gpt4 key购买 nike

我有以下在 SalesRecord 上运行的模型管理器:

def by_variety_and_date(self, start_date, end_date):
return self.model.objects.filter(
date__range=(start_date, end_date)
).values(
"variety"
).annotate(
qty_applied=Sum('qty_applied'),
margin=Avg('margin')
)

我真正想要的是 margin=Avg('margin') 返回基于 qty_applied加权平均值。有没有办法用 Django 的注释/聚合查询来做到这一点?我一直在尝试将 .aggregate() 字符串化到最后,但我仍然想要此查询集所描述的每个品种的平均值。

本例中的模型如下所示:

class Sale(models.Model):
margin = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=12)
qty_applied = models.IntegerField(null=True, blank=True)
variety = models.ForeignKey(Variety, null=True)
totals = Totals()

编辑

这就是我最后的结局。这有点奇怪,但它确实有效。

def by_variety_and_date(self, start_date, end_date):
return self.model.objects.filter(
date__range=(start_date, end_date)
).values(
"variety"
).annotate(
qty_applied=Sum('qty_applied'),
profit=Sum('profit'),
cogs=Sum('cogs'),
sales=Sum('value'),
margin=Sum(
(F('qty_applied')*F('margin')), output_field=FloatField()
) / Sum(
'qty_applied', output_field=FloatField())
)

我将 F 对象用作 @WTower建议将每个对象的 margin 与其 qty_applied 相乘,然后将整个对象封装在 Sum 中,并将其除以 Sum组中所有对象的 qty_applied 的 code>。奇迹般有效!

最佳答案

您可以使用F() expression

>>> from django.db.models import F, FloatField, Sum
>>> MyModel.objects.all().aggregate(
... w_avg=Sum((F('a')*F('b'))/F('b'), output_field=FloatField()))

有关聚合的更多信息 here .

或者,您可以在管理器中使用自定义 SQL(推荐)或自定义方法。

关于Django - 按组注释加权平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38758372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com