从Django数据库中提取数据

时间:2014-01-27 20:27:02

标签: python django kendo-ui

我正在进行基本的Django民意调查教程,并将民意调查结果放入Kendo图表中。我目前有一个条形图,圆环图和气泡图,显示所选民意调查问题的结果。我想添加一个折线图,但不仅仅使用所选投票的结果,还要包含其他问题的数据。有没有办法做到这一点,因为我无法找到答案。我已将我当前的代码放在下面。

# Javascript in results.html
$("#chart4").kendoChart({
  legend: {
    position: "bottom"
  },
  seriesDefaults: {
    type: "line"
  },
  series: [
    # Don't know what to do here
    { 
      name: ?
      data: ?
    }
  ],
  valueAxis: {
    labels: {
      format: "{0}%"
    }
  },
  categoryAxis: {
    categories: [{% for answer in question.answer_set.all %}"{{answer.choice_text}}", {% endfor %}]
  }
});

views.py

class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'
    context_object_name = 'latest_question_list'

    def get_queryset(self):
        """Return the last five published questions."""
        return Question.objects.order_by('id')

models.py

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('Date Published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
    return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

class Answer(models.Model):
    question = models.ForeignKey(Question)
    choice_position = models.IntegerField(default=0)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

1 个答案:

答案 0 :(得分:1)

最简单的方法是通过Ajax查询Django。您必须定义一个返回某些数据的视图(最好是json),然后从您的js脚本中调用它。

from django.core import serializers
from django.http import HttpResponse

def all_questions(request):
    """
    Most of the time you will have to do some extra work formating the json in 
    order to match the format  that the JS library is expecting.

    I can see your graph is expecting something like:

        series: [{  
                name: <some_sustom_name>
                data: <array of values>
            }
        ], 


    So you need to provide to the JS library the data it is expecting. 
    That means some array (or perhaps similar data structure). 

    """

    questions = Questions.objects.all()
    response = serializers.serialize('json', questions)

    # Now response contain a representation of a 
    # json object that has a property called data
    # besides, that property contain a list of Django objects.
    response = "{data: %s}" % response    

    return HttpResponse(response, content_type="application/json")

有关response内容的详细信息,请参阅:Serializing Django Objects

现在,假设您在javascript中获得了数据(Ajax调用是成功的),您将拥有类似的内容:

{data: [list of serialized Django objects]}

您只需处理上面的列表并提取图表的数据。当然,您可以直接从Django视图获取该列表。那是你的电话。

有关在series部分图表中添加内容的详细信息,请参阅此Kendo demo

从JQuery通过Ajax查询Django

为此你需要这样的代码:

$.ajax({
    type: "GET",                    // 1
    url:"url_to/you_view",          // 2
    data: {                         // 3
        'zip': zip,             
    },
    success: function(data){        // 4    

    },
    error: function(error){         // 5
        alert("Error");
    }
});

1 - 请求方法的规范(GET,POST,UPDATE等)

2 - 指向您视图的网址。     请注意,有任何协议规范(http)。因为你的js住在你的django应用程序中     网址是相对于此应用程序。为此你需要一些网址:

urlpatterns = patterns('your_app.views', 
    ...
    url(r'url_to/you_view', 'your_view')
    ...
)

3 - 可选,要发送到de django视图的一些数据。 (在你的情况下,你不需要它)

4 - 这很重要,在这里您将处理请求成功时服务器返回的数据。     按照上面的例子,这里的数据是一个json对象,如:

{data: [...]}

其中[...]代表jason格式的django序列化对象列表。(参见文档链接)。

5 - 在error上将调用此函数,而不是success指定的函数。

有关JQuery的$ .ajax对象的更多信息,请参阅$.ajax API Reference