在Django中求和记录值

1 投票
3 回答
2017 浏览
提问于 2025-04-15 22:40

我在我的应用里定义了几个模型:

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 %}

这些都是比较基础的内容。

花点时间去看看 Django 的 教程文档吧。

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

撰写回答