2

我有这个模型:

class Transfer(models.Model):
        transfer_code = models.CharField(max_length=30, blank=True, null=True)
        sender_name = models.CharField(max_length=30, blank=True, null=True)
        amount = models.IntegerField(blank=True, null=True)
        recipient_name = models.CharField(max_length=30, blank=True, null=True)
        time_sent = models.DateTimeField(auto_now_add=True, auto_now=False)
        received = models.BooleanField(default=False)
        time_received = models.DateTimeField(auto_now_add=False, auto_now=False, null=True)

        def __unicode__(self):
            return self.transfer_code

这是我想计算表中总金额的视图:

def listtransfersall(request):
    title = 'ALL TRANSFERS'
    queryset = Transfer.objects.all()
    for instance in queryset:
        total = 0
        total += instance.amount
        print total

    context = {
    "title": title,
    "queryset": queryset,
    "total": total,
    }
    return render(request, "listtransfersall.html",context)

这将单独打印表格中的金额。我怎样才能得到总数并将其分配给总变量?

4

3 回答 3

7

在您发布的代码中,您total = 0每次都通过循环设置

for instance in queryset:
    total = 0
    total += instance.amount
    print total

将该线移到循环之外,这将按照您的预期工作。

稍微好一点的方法是得到 avalues_list并求和:

amounts = Transfer.objects.values_list('amount', flat=True)
total = sum(amounts)

更好的是让数据库完成工作并使用 Sum 聚合:

from django.db.models import Sum
total = Transfer.objects.aggregate(Sum("amount"))

有关聚合的更多信息,请参阅文档

于 2017-02-20T22:08:50.450 回答
3

您可以为此使用注释。在你的情况下,试试这个:

from django.db.models import Sum

queryset = Transfer.objects.annotate(total_amount=Sum('amount'))

然后在您的模板中使用:

queryset.total_amount
于 2017-02-20T22:16:59.353 回答
1

我不确定我是否完全理解您的问题,但我认为您的问题是您total = 0在循环中声明。instance.amount因此,在每次迭代中添加 的值之前,它始终为 0 。

您必须total = 0在进入循环之前声明,就像这样

total = 0
for instance in queryset:
    total += instance.amount
print total

该代码将添加instance.amounttotal变量并打印总值。

于 2017-02-20T22:17:18.763 回答