2013-07-15 2 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 

То, что я пытаюсь сделать, это имея Google Map Chart отображается на основе записей журнала, так что я должен передать в шаблон что-то вроде этого :

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

Что является самым быстрым способом извлечения и передачи данных в шаблоны?

+0

Что такое популярность? Я также отредактировал код - вы определили страну внутри журнала. –

+0

такой же вопрос, популярность - это ключ к ответу на этот вопрос. –

+0

@Adam - Искренне ваш требуемый ответ .. Я бы хотел спросить вас, что .. Не думаете, что 'Class Log' должен иметь' user' как 'OnetoOneField' вместо' ForeignKey' 'auth.User' .. (если один пользователь может принадлежать только одной стране, это должно быть на самом деле)? Потому что это может повлиять на ответ ниже много для вашей статистики .. –

ответ

3

Я предполагаю, что popularity определяется как SQL count модели Log, сгруппированных по странам. Поправьте меня если я ошибаюсь. См. 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 %} 
    ]); 

Обратите внимание, что в шаблоне я проверяя forloop для последней итерации, а не в том числе замыкающей запятой, если он является последним итерация.

+0

В зависимости от потребностей ОР и данных журнала, я подозреваю, что мы должны нормализовать популярность для численности населения страны и, возможно, объяснить различия в проникновении широкополосного интернета. :-) –

+0

@ChrisWesseling, возможно, это помогло, если бы он определил, что означают цифры: P Но я думаю, что мой пример должен получить OP большую часть пути. –

Смежные вопросы