2010-05-13 94 views
0

值我在我的應用程序定義的情侶款:總和記錄在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中的這種聚合?

回答

4

亞歷山大的解決方案將給你正確的結果,但每個項目的查詢。使用 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 
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 
2

下面介紹一種方法。可能有更有效的方法來編寫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 tutorialsdocumentation