1

在 ASP.NET MVC 或 ASP.NET Web Api 中,如果我的 C# 代码如下所示,我可以在 jQuery 或 Angular.js 中接收数据列表:

return Json(list, JsonRequestBehavior.AllowGet);

我是 Django 的新手,所以如果我想在首页接收列表,我不知道如何在后端编写。

jQuery:

$.getJSON(url, function (list) {
    result=list
};

或者

Angular.js:

$http.get(url).success(function(list) {
    result=list
};

我的模特

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

假设数据库中有两个民意调查,
我在views.py中尝试了3种情况。

list = Poll.objects.all()

1.
return HttpResponse(list)

我在 jQuery 回调或 Angular 回调中得到的是"Poll objectPoll object"

2.
return HttpResponse(list.values())

我会得到 SyntaxError: " Unexpected token ' "

3.
return HttpResponse(list.values_list())

我会得到一个字符串(它似乎也不在 json 中):

"(1, u'Which city is the most beautiful all over the world?', datetime.datetime(2013, 10, 19, 7, 8, tzinfo=<UTC>))(2, u'What is your favourite city?', datetime.datetime(2013, 10, 19, 7, 8, 43, tzinfo=<UTC>))"

但是在 ASP.NET MVC 或 ASP.NET Web Api 中,即使我在后端(C#)中返回 json 列表,我总是在我的 js 回调中得到反序列化列表,所以我可以直接使用它。

我是否使用了错误的 QuerySet API 或错误的列表类型?

提前致谢。


当我尝试一些答案时编辑以添加信息:

感谢您提供详细的答案,但如果我使用:
return HttpResponse(json.dumps([poll.dict for poll in Poll.objects.all() ]))

然后我将代码更改为,
return HttpResponse(json.dumps(Poll.objects.values(), cls=DjangoJSONEncoder))
但我得到的是“[{'pub_date': datetime.datetime(2013, 10, 19, 7, 8, tzinfo=), 'question': u'Which city is the most beautiful all over the world?', u'id': 1}, {'pub_date': datetime.datetime(2013, 10, 19, 7, 8, 43, tzinfo=), 'question': u'你最喜欢哪个城市? ', u'id': 2}] 不是 JSON 可序列化的"

谷歌搜索后,我将代码更改为
return HttpResponse(serializers.serialize('json', Poll.objects.all()))
This time is no error in js callback,但接收到的数据结构如下所示:

Array[2] 0: Object   fileds: Object     pub_date:...     question:...   model: "polls.poll"   pk: 1 1: Object   fileds: Object     pub_date:...     question:...   model: "polls.poll"   pk: 2

如果我想得到我应该怎么做:

Array[2] 0: Object   id: 1   question:...   pub_date:... 1: Object   id: 2   question:...   pub_date:...

4

2 回答 2

1

在 Python/Django 中你会做的稍有不同。

现在,对于查询集,.values()有不同的含义。你可以在这里读到它

返回一个 ValuesQuerySet — 一个 QuerySet 子类,它在用作可迭代对象而不是模型实例对象时返回字典。

要实现您正在寻找的东西,您需要 python 提供的json模块

在模型中Poll

class Poll(models.Model):
    #attributes
    def to_json(self):
        return {'field1': 'attribute1', ... } #if you want a subset of all the attributes

在意见中:

polls = Poll.objects.all()
return HttpResponse(json.dumps([poll.to_json() for poll in polls ]))

现在,如果你想要所有属性,你可以这样做:

polls = Poll.objects.all()
return HttpResponse(json.dumps([poll.__dict__ for poll in polls ]))

另外,不要list用作局部变量名,因为它与构建类型冲突。

于 2013-10-27T21:46:25.200 回答
0
import json

return HttpResponse(json.dumps(Poll.objects.all()), 
                    content_type="application/json")

以上用于json序列化您的查询集。我不确定是否有一些模型字段在被序列化时可能会阻塞,所以你可能想看看django 序列化程序中的 bulit


如果您有许多 API 端点,我建议您查看django-rest-framework

于 2013-10-27T21:46:36.570 回答