2013-07-15 233 views
4

我有這兩種模式:提取數據

class Log(models.Model): 
    ... 
    country = models.ForeignKey(Country, null=True, blank=True) 
    ... 
    user = models.ForeignKey('auth.User') 


class Country(models.Model): 
    name = models.CharField(max_length=50) 
    alpha_2_code = models.CharField("Alpha-2 code", max_length=2, unique=True) 
    alpha_3_code = models.CharField("Alpha-3 code", max_length=3, unique=True) 
    numeric_code = models.PositiveSmallIntegerField("Numeric code", max_length=3, unique=True) 
    order = models.SmallIntegerField(max_length=3) 
    continent = models.ForeignKey(Continent) 

    def __unicode__(self): 
     return self.name 

什麼我想是有谷歌地圖圖表顯示基於日誌條目做的,所以我要傳遞給模板是這樣的:

function drawRegionsMap() { 
     var data = google.visualization.arrayToDataTable([ 
      ['Country', 'Popularity'], 
      ['Germany', 200], 
      ['United States', 300], 
      ['Brazil', 400], 
      ['Canada', 500], 
      ['France', 600], 
      ['RU', 700] 
     ]); 

什麼是提取和傳遞數據到模板的最快方法?

+0

什麼是人氣?我還編輯了代碼 - 您在Log中定義了Country。 –

+0

同樣的問題,人氣是回答這個問題的關鍵 –

+0

@亞當 - 與你所需的答案無關..我想問你..你不覺得'類日誌'應該有'用戶'作爲'OnetoOneField'而不是' ForeignKey'設爲'auth.User' ..(如果一個用戶只能屬於一個國家 - 實際上應該是這樣)?因爲這可以影響你的統計以下很多答案.. –

回答

3

我在這裏假設popularity被定義爲Log模型的SQL count,按國家分組。如我錯了請糾正我。有關更多信息,請參閱aggregation documentation

from django.db.models import Count 
queryset = Log.objects.values('country__name').annotate(popularity=Count('country__name')) 

然後在你的模板,你會怎麼做:

var data = google.visualization.arrayToDataTable([ 
     ['Country', 'Popularity'], 
     {% for log in queryset %} 
     ['{{ log.country.name }}', {{ log.popularity }} ] {% if not forloop.last %},{% endif %} 
     {% endfor %} 
    ]); 

注意,在模板中,我檢查了最後一次迭代的for循環,而不是包括後面的逗號,如果它是最後一個迭代。

+0

根據OP需求和日誌記錄,我懷疑我們應該規範普及全國人口規模的普及程度,也許考慮到寬帶互聯網普及率的差異。 :-) –

+0

@ChrisWesseling,如果他定義了數字的意思,它可能會有所幫助:P但是我認爲我的例子應該是OP的大部分。 –