代码之家  ›  专栏  ›  技术社区  ›  radzia2

django查询中的饼图高位图

  •  1
  • radzia2  · 技术社区  · 9 年前

    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
    

    打印输出由 parse_data_browser

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

    挑战在于如何将其塑造成这样:

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

    然后将其传递到我的索引。使用以下脚本的html:

    <script>
        var chart_id = {{ chartID|safe }}
        var chart = {{ chart|safe }}
        var title = {{ title|safe }}
        var yAxis = {{ yAxis|safe }}
        var data = {{ data|safe }}
    </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>
    

    我用dict和append函数尝试了多种方法,但都没有给出正确的输出。

    最好的方法是什么。我不希望在我的环境中开始堆叠输出json文件,因为这似乎是一种方法。

    谢谢你的帮助

    1 回复  |  直到 9 年前
        1
  •  2
  •   Nadège    9 年前

    您可以迭代查询并构建列表:

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

    这被称为列表理解。

    或者,您仍然可以将查询集传递给模板,并按如下方式构建数据:

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

    <script> .