2010-05-13 5 views
0

je définissais modèles couple dans mon application:Somme enregistre les valeurs dans 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() 

Je veux résumer les coûts pour chaque projet et rendre les valeurs 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',... 

Quelle est la meilleure façon de résoudre une telle agrégation dans Django ORM?

Répondre

4

solution de Alexander vous donnera le bon résultat, mais avec une requête pour chaque projet. Utilisez annotate pour faire le tout dans une seule requête.

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

Essayez d'utiliser 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

Voici une façon de le faire. Il peut y avoir un moyen plus efficace d'écrire la fonction get_total_cost ... mais cela devrait fonctionner.

Modèles:

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() 

Voir:

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)) 

Modèle:

{% for project in projects %} 
<p>{{project.title}}: {{project.get_total_cost}}</p> 
{% endfor %} 

Ce sont des choses assez basique. Prenez le temps de passer par le Django tutorials et documentation.

Questions connexes