2017-08-10 5 views
1

Je cours une requête dans views.py dans un environnement django. Tout est actuellement en cours d'exécution locale avec l'idée de le pousser finalement dans un environnement heroku. J'utilise PostgreSQL.Diagrammes en haute résolution de la requête django

def test(request): 
    click_results = clickstats.objects.filter(user=request.user.username, urlid=pk_int) 
    data = parse_data_browser(request, click_results) 
    template = get_template('index.html') 
    context = { 
    'data': data, 
    } 
    return HttpResponse(template.render(context,request)) 

def parse_data_browser(request,click_results): 

    browsers = click_results.values('browser').annotate(browser_qty=Count('browser')).order_by() 
    print("browsers") 
    print(browsers) 
    return browsers 

la sortie imprimée par parse_data_browser ressemble à ceci:

<QuerySet [{'browser': 'Chrome Mobile', 'browser_qty': 4}, {'browser': 'Chrome', 'browser_qty': 9}]> 

le défi est d'obtenir dans cette forme:

data = [{name: 'Chrome Mobile', y: 4}, {name: 'Chrome', y: 9}] 

passant ensuite à mon index.html en utilisant les scripts suivants:

<script> 
    var chart_id = {{ chartID|safe }} 
    var chart = {{ chart|safe }} 
    var title = {{ title|safe }} 
    var yAxis = {{ yAxis|safe }} 
    var data = {{ data|safe }} 
</script> 

et enfin créer le graphique avec ce script:

<script> 
$(function() { 
    var myChart = Highcharts.chart('chartID', { 
     chart: { 
      plotBackgroundColor: null, 
      plotBorderWidth: null, 
      plotShadow: false, 
      type: 'pie' 
     }, 
     series: [{ 
      name: 'Brands', 
      colorByPoint: true, 
      data: [{name: 'Chrome Mobile', y: 4}, {name: 'Chrome', y: 9}] 
     }] 
    }); 
}); 
</script> 

J'ai essayé plusieurs choses avec dict et ajouter des fonctions, mais rien ne donne la sortie à droite.

Quelle est la meilleure approche. Je préférerais ne pas commencer à empiler des fichiers output-json sur mon environnement car cela me semble être une solution.

merci pour l'aide

Répondre

1

vous pouvez itérer sur la requête et construire une liste:

data = [{'name': item['browser'], 'y': item['browser_qty'] } 
     for item in parse_data_browser_result.all() ] 

Ce qu'on appelle une compréhension de la liste.

Ou vous pouvez toujours passer le queryset au modèle et de construire les données comme celui-ci:

data: [ 
    {% for item in data.all() %} 
     {% if total > 0 %} 
      { name: "{{ item['browser'] }}", y: {{ item['browser_qty'] }} }, 
     {% endif %} 
    {% endfor %} 
] 

à l'intérieur du <script>.

+0

exactement ce que je cherchais! grande aide! a dû faire quelques modifications car 'item.browser' a renvoyé un objet' AttributeError: 'dict' n'a pas d'attribut 'browser'' et a fait une solution de contournement comme ceci: 'data = [{' name ': item [' browser '], 'y': item ['browser_qty']} pour item dans les navigateurs] '- n'aime pas les templates dans mon html, tres en désordre :-) – radzia2

+0

ah oui, bien sur c'est un dict, va mettre à jour ma réponse. Heureux de t'avoir aidé :) –