2010-04-30 96 views
0

我想了一下關於Django aggregates.的概念我不太「得到」他們如何在我的情況下使用。基本上我的模型中有三層對象,最低的對象(Bar)包含我想要聚合的值。模板中的Django聚合?

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

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

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

我想我的模板做的這相當於:

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

不過,當然這個模板僅僅是僞代碼,它不會工作,因爲,我想,模板不應該通過設計做到這一點。但另一方面,在我看來,不得不預先計算平均金額也會感覺不對。應該如何處理這個問題?

我還是新來的Django,所以我想知道這樣做:)

回答

2

這項工作應在視圖中進行的「Django的方式」。你說這感覺不對,但這正是視圖所要做的:檢索將要呈現給用戶的數據。看看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看上去是一個MVC框架,但你所說的控制器 「查看」,並查看 「模板」。你怎麼不使用標準名稱 ?

在我們對MVC的解釋中, 「視圖」描述了獲得 呈現給用戶的數據。這不是 必然如何數據看起來,但 哪些數據是呈現。視圖 描述您看到哪些數據,而不是您看到的數據如何 。這是一個微妙的區別。

A麪點,這是基於你如何使用您的模板的平均,它可能會更有意義使用annotate而非aggregatehttp://docs.djangoproject.com/en/1.1/ref/models/querysets/#annotate-args-kwargs

1

該模板不允許您調用帶參數的函數。見here他們讓你做什麼。

解決這個問題的規範方法是向模型中添加一些輔助方法/管理器或創建一個custom template tag or filter