2016-08-04 49 views
2
集團註解後加權平均

我已經得到了一個SalesRecord操作如下模型管理器:Django的 - 通過

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()來結束它,但我仍然希望按照此查詢集描述的每variety的平均值。

在這種情況下,模型是這樣的:

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和通過該組中的所有對象的qty_appliedSum劃分它。奇蹟般有效!

回答

3

可以使用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(而不是推薦)或自定義方法。

+0

沒有自定義SQL需要:)。這是一個自定義管理器方法,順便說一句。 –