我如何总结 Django 模型的内容
How can i sum the content of a django model
我有这个型号:
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
这是我的观点,我想计算 table 中的总金额:
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)
这将单独打印 table 中的金额。
我怎样才能得到总数并将其分配给总变量?
在您发布的代码中,您每次通过循环设置 total = 0
for instance in queryset:
total = 0
total += instance.amount
print total
将该行移到循环之外,这将按您预期的方式工作。
稍微好一点的是得到一个 values_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"))
有关聚合的详细信息,请参阅 documentation
您可以使用 annotate。在你的情况下,试试这个:
from django.db.models import Sum
queryset = Transfer.objects.annotate(total_amount=Sum('amount'))
然后在您的模板中使用:
queryset.total_amount
我不确定我是否完全理解你的问题,但我认为你的问题是你在循环中声明 total = 0
。因此,在每次迭代添加 instance.amount
的值之前,它将始终为 0。
你必须在进入循环之前声明total = 0
,像这样
total = 0
for instance in queryset:
total += instance.amount
print total
该代码会将 instance.amount
添加到 total
变量并打印总值。
我有这个型号:
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
这是我的观点,我想计算 table 中的总金额:
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)
这将单独打印 table 中的金额。 我怎样才能得到总数并将其分配给总变量?
在您发布的代码中,您每次通过循环设置 total = 0
for instance in queryset:
total = 0
total += instance.amount
print total
将该行移到循环之外,这将按您预期的方式工作。
稍微好一点的是得到一个 values_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"))
有关聚合的详细信息,请参阅 documentation
您可以使用 annotate。在你的情况下,试试这个:
from django.db.models import Sum
queryset = Transfer.objects.annotate(total_amount=Sum('amount'))
然后在您的模板中使用:
queryset.total_amount
我不确定我是否完全理解你的问题,但我认为你的问题是你在循环中声明 total = 0
。因此,在每次迭代添加 instance.amount
的值之前,它将始终为 0。
你必须在进入循环之前声明total = 0
,像这样
total = 0
for instance in queryset:
total += instance.amount
print total
该代码会将 instance.amount
添加到 total
变量并打印总值。