Django:如何在 Jquery 中使用 $getJSON 或在 Angular.js 中使用 $http.get 接收 QuerySet?

Posted

技术标签:

【中文标题】Django:如何在 Jquery 中使用 $getJSON 或在 Angular.js 中使用 $http.get 接收 QuerySet?【英文标题】:Django: How to receive QuerySet with $getJSON in Jquery or $http.get in Angular.js? 【发布时间】:2013-11-06 14:01:42 【问题描述】:

在 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 或错误的 List Type?

提前致谢。


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

感谢您提供详细的答案,但如果我使用 @ 987654332@

然后我将代码更改为 return HttpResponse(json.dumps(Poll.objects.values(), cls=DjangoJSONEncoder)) 但我得到的是 "['pub_date': datetime.datetime(2013, 10, 19, 7, 8, tzinfo=) , 'question': u'世界上哪个城市最美?', u'id': 1, 'pub_date': datetime.datetime(2013, 10, 19, 7, 8, 43, tzinfo =), 'question': u'What is your 最喜爱的 city?', u'id': 2] is not JSON serializable"

google了之后,我把代码改成了return HttpResponse(serializers.serialize('json', Poll.objects.all()))这次js回调没有错误,但是接收到的数据结构如下:

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:...

【问题讨论】:

【参考方案1】:

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

现在,对于查询集,.values() 具有不同的含义。 You can read about it here

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

要实现你想要的,你需要python提供的json module。

在模型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 作为局部变量名,因为它与构建类型冲突。

【讨论】:

我根据您的回答编辑了原始问题,请看一下。 :) 为什么要采用这种特定格式?只要能解析正确的json,何必担心呢? 你的意思是我在js回调中收到的数据结构?因为如果将js代码迁移到其他背景(例如ASP.NET MVC),我不想更改js回调中的代码,所以我想使用从后端返回的具有正常模型结构的数据列表。最后,我将返回代码更改为 return HttpResponse(json.dumps(list(poll_list.values()), cls=DjangoJSONEncoder)) 并得到了想要的结果。【参考方案2】:
import json

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

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


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

【讨论】:

是的,不能序列化 DateTimeField。我编辑了原始问题,请看一下。顺便说一句,这只是我学习Django的一个示例项目,所以我不想使用django-rest-framework之类的其他框架。 :) 我会说不使用 django-rest-framework 将是一个巨大的错误。无异于说,我想跑得快,却不想用***,也不想用机翼,也不想用引擎。

以上是关于Django:如何在 Jquery 中使用 $getJSON 或在 Angular.js 中使用 $http.get 接收 QuerySet?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 在 Django 中提供图像

如何使用 Modelform 和 jquery 在 django 中获取相互依赖的下拉菜单?

如何在 Django 模板中使用 Jquery/Ajax 正确刷新 div

如何在 django 中使用 jquery 更改多个图像 src

如何在 Django Form 中使用 Jquery 脚本的值?

Django:如何在 Jquery 中使用 $getJSON 或在 Angular.js 中使用 $http.get 接收 QuerySet?