【问题标题】:Sum of a column with group by in djangodjango中带有group by的列的总和
【发布时间】:2018-02-12 17:05:22
【问题描述】:

我在尝试使用 django orm 模型运行的这个 sql 查询方面需要一些帮助。

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']

我在这里做错了什么?

【问题讨论】:

  • 您是如何获得json 的?请显示代码
  • 请添加CapitalSheetSerializer的代码
  • 我已经更新了问题。

标签: mysql django django-rest-framework


【解决方案1】:

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

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

【讨论】:

  • 谢谢,现在我意识到我做错了什么,我试过这个.annotate(total=Sum("capital")),现在我知道字段名应该与你试图计算总和的列名相同.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多