Django Aggreagtion:仅返回值?

Ste*_*en 24 python django sum aggregation

我有一个已支付的价值清单,并希望显示已支付的总金额.我使用Aggregation和Sum来一起计算值.问题是,我只想要打印出总值,但是聚合打印出:( {'amount__sum': 480.0}480.0是总增加值.

在我看来,我有:

    from django.db.models import Sum

    total_paid = Payment.objects.all.aggregate(Sum('amount'))
Run Code Online (Sandbox Code Playgroud)

为了显示页面上的值,我有一个mako模板,其中包含以下内容:

    <p><strong>Total Paid:</strong> ${total_paid}</p>
Run Code Online (Sandbox Code Playgroud)

如何让它显示480.0而不是{'amount__sum': 480.0}

jpr*_*itt 34

我不相信有办法只获得价值.

你可以${{ total_paid.amount__sum }}在你的模板中做.或者total_paid = Payment.objects.all().aggregate(Sum('amount')).get('amount__sum', 0.00)在你看来.

编辑

正如其他人所指出的那样,.aggregate()将始终返回一个字典,其中包含来自聚合的所有键,因此不需要.get()对结果进行操作.但是,如果查询集为空,则每个聚合值都是None.因此,根据您的代码,如果您期望浮动,您可以这样做:

total_paid = Payment.objects.all().aggregate(Sum('amount'))['amount__sum'] or 0.00


meh*_*met 18

给它一个名字,然后要求它:

total_paid = Payment.objects.all.aggregate(sum=Sum('amount'))['sum']
Run Code Online (Sandbox Code Playgroud)

应该更具可读性,并且不需要转换.

  • 请注意,尽量不要使用内置函数的名称,例如 [`sum`](https://docs.python.org/3/library/functions.html#sum) (2认同)

nim*_*smi 17

aggregate()方法返回一个字典.如果你知道你只返回一个你可以使用的单项词典.values()[0].

Python 2中:

total_paid = Payment.objects.aggregate(Sum('amount')).values()[0]
Run Code Online (Sandbox Code Playgroud)

Python 3中,(感谢@lmiguelvargasf)这需要:

total_paid = list(Payment.objects.aggregate(Sum('amount')).values())[0]
Run Code Online (Sandbox Code Playgroud)

最终结果与@ jproffitt的答案相同,但它避免重复该amount__sum部分,因此它更通用一些.

  • 这也是我的首选解决方案.`values()`在Python 3中[已更改](http://stackoverflow.com/questions/17431638/get-typeerror-dict-values-object-does-not-support-indexing-when-using-python)返回视图而不是列表.传递`values()`到`list()`的返回使得这个解决方案起作用. (2认同)