2011-02-11 4 views
0

J'ai deux modèles.aux prises avec django regrouper

Un projet et un modèle de backers.

Je veux essentiellement exécuter une requête qui renvoie les projets avec le plus de backers.

Est-ce que le regroupement est la seule façon d'y parvenir?

class Project(models.Model): 
    owner = models.ForeignKey(User) 
    project_name = models.CharField(max_length=50, help_text='Lorem ipsum dolor sit amet.') 

class Backer(models.Model): 
    user = models.ForeignKey(User) 
    project = models.ForeignKey(Project) 
    amount = models.PositiveIntegerField() 

J'ai essayé ce qui suit:

{% regroup backers by project as backers_list %} 
{% for obj in backers_list %} 
    <strong>{{ obj.grouper }}</strong><br /> 
{% endfor %} 

bien que cela retourne plus de résultats escomptés.

Donc, je veux essentiellement obtenir le montant total des bailleurs de fonds qui ont soutenu un projet.

Répondre

4

Je ne suis pas sûr de ce que vous faites avec regroup, mais le projet avec le plus grand nombre de bailleurs de fonds est:

Project.objects.annotate(Count('backer')).latest('backer__count') 

utilisant l'annotation http://docs.djangoproject.com/en/dev/topics/db/aggregation/

Si vous vouliez les 10 plus backed projets, il serait

Project.objects.annotate(Count('backer')).order_by('-backer__count')[:10] 

Mise à jour: Je vois que vous pourriez vouloir dire "montant" comme dans le champ Backer.amount, auquel cas vous modifieriez la requête pour utiliser django.db.models.Sum.

Project.objects.annotate(amount = Sum('backer__amount')).order_by('-amount')[:10] 
Questions connexes