2014-11-03 93 views
0

我想製作一個sumarized庫存報告。要做到這一點我有我的模式是這樣的:Django Group_By和SUM查詢

class Inventario(models.Model): 
    producto = models.ForeignKey(Producto) 
    cantidad = models.DecimalField(default=0,decimal_places=2, max_digits=10) 
    ubicacion = models.ForeignKey(Ubicacion, null=True, blank=True) 
    def __unicode__(self): 
     return self.producto.item 

在SQL-RAW我會像SELECT producto.nombre as item, sum(cantidad) as cantidad,... FROM Inventario GROUP BY item用正確的加入課程

的,我會得到這樣的:

|Item------- | Cantidad| 
|PROD1  | 20  | 
|PROD2  | 10  | 

而不是

|Item------- | Cantidad| 
|PROD1  | 5  | 
|PROD1  | 5  | 
|PROD1  | 10  | 
|PROD2  | 9  | 
|PROD2  | 1  | 

我想要使用它的Django的方式,其實我有

productos = Inventario.objects.filter(cantidad__gt=0).aggregate(Sum('cantidad')) 

這將返回我只cantidad_sum:30

UPDATE 我現在明白了GROUP BY與此代碼

query = Inventario.objects.all().query 
query.group_by = ['inventario_inventario.producto_id'] 
productos = QuerySet(query=query, model=Inventario) 

,但現在我不知道如何使 「SUM」 功能:/

回答

2

嘗試使用annotate而不是aggregateaggregate總結了整個查詢集,而annotate則爲每個組生成值。例如,

productos = Inventario.objects.filter(cantidad__gt=0).values('producto').annotate(sum_cantidad=Sum('cantidad')) 

退房的django docs瞭解更多詳情。

+0

我已經嘗試過註釋,但是這仍然返回整個表格,就像沒有任何GROUP_BY – 2014-11-03 22:23:33

+0

對不起 - 對了。嘗試鏈接「.values('producto')」 - 這應該給你分組。我更新了我的答案以反映這 – 2014-11-03 22:27:49

+0

'values'產生了魔力,但是...我得到了producto的ID,你知道如何從外鍵獲取一個值嗎?像producto.item?或者producto.description?謝謝 – 2014-11-03 22:31:11