2010-04-30 5 views
0

Je pense un peu au concept de Django aggregates. Je ne comprends pas vraiment comment ils peuvent être utilisés dans mon cas. Fondamentalement, j'ai une hiérarchie d'objets à trois niveaux dans mon modèle, et l'objet le plus bas (Bar) contient des valeurs que je veux agréger.Agrégation Django dans les modèles?

class Bar(models.Model): 
    amount = models.FloatField() 

class Foo(models.Model): 
    bars = models.ManyToManyField(Bar) 

class MyUser(models.Model): 
    foos = models.ManyToManyField(Foo) 

Je veux que mon modèle pour faire l'équivalent de ceci:

{% for user in users %} 
    <h2>{{ user }}</h2> 
    <table> 
     <tr> 
      <td>Foo</td>< 
      <td>Average bar amount</td> 
     </tr> 
    {% for foo in user.foos.all %} 
     <tr> 
      <td>{{ foo }}</td> 
      <td>{{ foo.bars.all.aggregate(Avg('amount')) }} 
     </tr> 
    {% endfor %} 
    </table> 
{% endfor %} 

Mais bien sûr, ce modèle est juste pseudo code, il ne fonctionnera pas parce que, je suppose, les modèles ne sont pas censés faites ceci par conception. Mais d'un autre côté, avoir à pré-calculer les montants moyens à mon avis aurait tort aussi. Comment ce problème devrait-il être abordé?

Je suis encore nouveau pour Django, donc je veux savoir la « façon Django » de le faire :)

Répondre

2

Ce travail doit être effectué dans la vue. Vous dites que c'est mal, mais c'est exactement ce que la vue est censée faire: récupérer les données qui vont être présentées à l'utilisateur. Jetez un oeil à la FAQ Django: http://docs.djangoproject.com/en/dev/faq/general/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names

Django semble être un framework MVC, mais vous appelez le contrôleur le « modèle » « vue », et la vue du . Pourquoi ne pas utiliser les noms standards ?

Dans notre interprétation de MVC, la "vue" décrit les données qui sont présentées à l'utilisateur. Ce n'est pas nécessairement à quoi ressemblent les données, mais quelles données sont présentées. La vue décrit quelles données vous voyez, pas comment vous le voyez. C'est une distinction subtile.

Un point de côté à cela est que sur la base la façon dont vous utilisez la moyenne dans votre modèle, il serait probablement plus judicieux d'utiliser annotate plutôt que aggregate. http://docs.djangoproject.com/en/1.1/ref/models/querysets/#annotate-args-kwargs

1

Les modèles ne vous permettent pas d'appeler des fonctions qui prennent des arguments. Voir here pour ce qu'ils vous permettent de faire.

La façon canonique de gérer cela serait d'ajouter des méthodes/gestionnaires auxiliaires à vos modèles ou de créer un custom template tag or filter.

Questions connexes