34

我有一个支付的价值列表,想显示支付的总额。我使用了聚合并Sum一起计算了这些值。问题是,我只想打印出总值,但会打印出聚合:{'amount__sum': 480.0}(480.0 是增加的总值。

在我看来,我有:

    from django.db.models import Sum

    total_paid = Payment.objects.all.aggregate(Sum('amount'))

为了在页面上显示值,我有一个带有以下内容的 mako 模板:

    <p><strong>Total Paid:</strong> ${total_paid}</p>

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

4

6 回答 6

53

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

你可以${{ 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

于 2013-10-02T13:56:11.937 回答
29

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

total_paid = Payment.objects.all.aggregate(sum=Sum('amount'))['sum']

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

于 2016-06-10T15:20:35.053 回答
22

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

Python 2中:

total_paid = Payment.objects.aggregate(Sum('amount')).values()[0]

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

total_paid = list(Payment.objects.aggregate(Sum('amount')).values())[0]

最终结果与@jproffitt 的答案相同,但它避免了重复该amount__sum部分,所以它更通用一点。

于 2014-09-25T16:18:34.110 回答
2

在 Python 3 中

dict_values您可以通过将其转换为 a来解决它list

total_paid = list(Payment.objects.aggregate(Sum('amount')).values())[0] or 0 # the or 0 is required in case the query is an empty query set.

前面的代码避免使用'column_name__sum'as 键,但如果您更喜欢字典方式:

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

在效率方面,我用我有的一些数据做了一个测试,似乎使用字典键更快:

In [9]: %timeit total = Pledge.objects.filter(user=user, group__isnull=True).aggregate(Sum('amount'))['amount__sum'] or 0
3.13 ms ± 25.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [10]: %timeit total = list(Pledge.objects.filter(user=user, group__isnull=True).aggregate(Sum('amount')).values())[0] or 0
3.22 ms ± 61.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

在可读性方面,我认为@mehmet 的解决方案是最好的,我也测试了它的效率:

In [18]: %timeit Pledge.objects.filter(user=user, group__isnull=True).aggregate(sum=Sum('amount'))['sum'] or 0
3.22 ms ± 124 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
于 2018-01-07T03:04:10.703 回答
0

(仅在使用小数字段时才有用)将键值存储在新变量中,如果使用小数,则将其转换为浮点数。我认为这是最简单的方法

total_paid = Payment.objects.all.aggregate(Sum('amount'))
# output: {'amount__sum':Decimal('0000.000000')
tp=total_paid['amount__sum']
new_total_paid=float(tp)
于 2020-11-29T22:29:07.923 回答
0

100%您可以通过这种技术解决您的需求

from django.db.models import Sum

sum_count = Payment.objects.aggregate(Sum('amount'))
totalAmonut = sum_count['Qty__sum']
于 2021-06-05T10:51:31.933 回答