2013-07-15 231 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的大部分。 –