2017-09-04 80 views
1

我试图用django orm模型运行这个sql查询,需要一些帮助。在django中加入一列的总和

SELECT SUM(CAPITAL) AS PRODUCT_CAPITAL, PRODUCT FROM CAPITAL_SHEET 
WHERE CLIENT_ID = 'X1234' 
GROUP BY PRODUCT 

我这样做

CapitalSheet.objects.filter(client_id="X1234").values("product").annotate(Sum("capital")) 

这是我得到在JSON结果:

[ 
    { 
     "product": "product1" 
    }, 
    { 
     "product": "product2" 
    } 
] 

我期待这是输出:

[ 
    { 
     "product": "product1", 
     "capital": 1234.00 
    }, 
    { 
     "product": "product2", 
     "capital": 1234.00 
    } 
] 

这里是我的看法:

class CapitalListView(ListAPIView): 
    serializer_class = CapitalSheetSerializer 

    def get_queryset(self): 
     return CapitalSheet.objects.filter(client_id="X1234").values("product").annotate(Sum("capital")) 

这里是我的模型:

class CapitalSheet(models.Model): 
    log_id = models.AutoField(db_column='LOG_ID', primary_key=True) 
    client_id = models.CharField(db_column='CLIENT_ID', max_length=25) 
    capital = models.DecimalField(db_column='CAPITAL', max_digits=10, decimal_places=2, blank=True, null=True) 
    payout_booked_profit = models.DecimalField(db_column='PAYOUT_BOOKED_PROFIT', max_digits=10, decimal_places=2, blank=True, null=True) 
    voucher_number = models.CharField(db_column='VOUCHER_NUMBER', max_length=45, blank=True, null=True) 
    ledger_date = models.DateField(db_column='LEDGER_DATE', blank=True, null=True) 
    amount = models.DecimalField(db_column='AMOUNT', max_digits=10, decimal_places=2, blank=True, null=True) 
    product = models.CharField(db_column='PRODUCT', max_length=45, blank=True, null=True) 
    transaction_type = models.CharField(db_column='TRANSACTION_TYPE', max_length=45, blank=True, null=True) 
    sebi_payin_flag = models.IntegerField(db_column='SEBI_PAYIN_FLAG', blank=True, null=True) 
    dividend_payout_flag = models.IntegerField(db_column='DIVIDEND_PAYOUT_FLAG', blank=True, null=True) 

我的串行:

class CapitalSheetSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = CapitalSheet 
     fields = ['capital','product'] 

我到底错在这里做什么?

+0

怎么你得到'json'?显示代码请 –

+0

请添加代码'CapitalSheetSerializer' –

+0

我已更新此问题。 – Zed

回答

1

尝试,为注释列添加名称:

CapitalSheet.objects.filter(
    client_id="X1234" 
).values("product").annotate(capital=Sum("capital")) 
#       ^^^^^^^ 
+0

谢谢,现在我意识到我在做错了什么,我曾尝试过这种'.annotate(total = Sum(“capital”))',现在我知道字段名称应该与您尝试的列名称相同来计算总和。 – Zed