在Django中求和记录值
我在我的应用里定义了几个模型:
class Project(models.Model):
title = models.CharField(max_length=150)
url = models.URLField()
manager = models.ForeignKey(User)
class Cost(models.Model):
project = models.ForeignKey(Project)
cost = models.FloatField()
date = models.DateField()
我想要对每个项目的费用进行汇总,并在 view.py
中显示这些值:
from mypm.costs.models import Project, Cost
from django.shortcuts import render_to_response
from django.db.models import Avg, Sum
def index(request):
# ...
return render_to_response('index.html',...
在 Django 的 ORM 中,解决这种汇总的最佳方法是什么?
3 个回答
2
试着使用 aggregate 这个功能。
from django.db.models import Sum
for project in Projects.objects.all():
print project, project.cost_set.all().aggregate(sum_of_cost=Sum('cost'))['sum_of_cost'] or 0
3
这里有一种方法可以做到。可能还有更有效的方式来写 get_total_cost 函数……不过这个方法应该是可以用的。
模型:
class Project(models.Model):
title = models.CharField(max_length=150)
url = models.URLField()
manager = models.ForeignKey(User)
def get_total_cost(self):
tot = 0
for cost in Cost.objects.filter(project=self):
tot += cost.cost
return tot
class Cost(models.Model):
project = models.ForeignKey(Project)
cost = models.FloatField()
date = models.DateField()
视图:
from mypm.costs.models import Project, Cost
from django.shortcuts import render_to_response
from django.db.models import Avg, Sum
def index(request):
return render_to_response('index.html',{'projects',Project.objects.all()},context_instance=RequestContext(request))
模板:
{% for project in projects %}
<p>{{project.title}}: {{project.get_total_cost}}</p>
{% endfor %}
这些都是比较基础的内容。
5
亚历山大的解决方案能给你正确的结果,但每个项目都需要一个查询。你可以使用 annotate
来一次性完成所有的查询。
from django.db.models import Sum
annotated_projects = Project.objects.all().annotate(cost_sum=Sum('cost__cost'))
for project in annotated_projects:
print project.title, project.cost_sum