在一个HttpResponse中返回两件事

时间:2010-09-29 02:56:39

标签: jquery ajax django serialization response

我正在尝试跨越ajax调用实现分页。当用户想要查看下一个x num结果时,页面不应刷新。

这是我的问题。返回QuerySet非常简单。我只是做(sumaJson是自定义的)

data = serializers.serialize('sumaJson', result_page.object_list, relations=('first_major', 'country_of_origin', 'second_major'))
return HttpResponse(data, mimetype="application/json") 

现在我也希望返回像

这样的内容
result_page.has_previous()
result_page.has_next()
result_page.paginator.count

等等。我为我的生活无法弄清楚如何在一个回应中得到两者。我无法将此信息添加到result_page.object_list,因为然后序列化程序失败。如果我有某种

simplejson.dumps(paging_info + result_page.object_list)

然后在javascript中,QuerySet不再是对象列表,而只是一大串字符,无法用

解释
$.each(data.data, function(index, item){

我尝试了一些糟糕的黑客攻击,例如创建一个假对象并将其放入object_list,序列化然后删除该对象。这允许我获取数据。但是,我不想创建和删除虚假对象。

我不想干扰序列化程序。一旦我获得querySet以获取分页信息,我不想发送第二个ajax请求。

我错过了什么吗?有没有一种简单的方法可以在一个响应中获得两者?谢谢!

3 个答案:

答案 0 :(得分:2)

当我序列化一组对象时,我通常会在响应正文中包含分页信息。如果我有50个对象,我想每页提供10个,那么JSON看起来像这样:

{
    "count": 50,
    "objects": [
        {
            ...
        }
    ],
    "pages": {
        "count": 5,
        "current": "http://api.example.com/objects/?page=3",
        "first": "http://api.example.com/objects/",
        "last": "http://api.example.com/objects/?page=5",
        "next": "http://api.example.com/objects/?page=4",
        "previous": "http://api.example.com/objects/?page=2"
    }
}

答案 1 :(得分:1)

我过去为ajax调用所做的是将json作为HttpResponse返回,就像你正在做的那样,并为我想要返回的任何其他字段添加一个标题。

data = serializers.serialize('sumaJson', result_page.object_list, relations=('first_major', 'country_of_origin', 'second_major'))
response = HttpResponse(data, mimetype="application/json") 
response['X-VALUE'] = 'asdf' #this is the header, you can create as many of these as you'd like
return response

并在javascript方面......

$.ajax({
  url: '/whatever/here/',
  success: function(data, code, xhr) {
    alert(xhr.getResponseHeader('X-VALUE'));
  }
});

希望这会有所帮助。

答案 2 :(得分:1)

simplejson.dumps()可以深度序列化字典,甚至递归。

您可以采取两种方法。第一种是在QuerySets上使用Django ORM的values()方法:它使用对象ID而不是引用来生成纯python词典,适用于序列化。

如果你需要甚至更深,你可能需要写一些东西来创建jpwatts提出的字典结构。如果你需要这种能力,我have a post on my personal blog关于向simplejson添加函子,生成器,迭代器和闭包。该示例演示了如何将Treebeard树结构转换为javascript对象。

代码是:

from django.utils.simplejson.encoder import JSONEncoder

class ExtJsonEncoder(JSONEncoder):
    def default(self, c):
        # Handles generators and iterators
        if hasattr(c, '__iter__'):
            return [i for i in c]

        # Handles closures and functors
        if hasattr(c, '__call__'):
            return c()

        return JSONEncoder.default(self, c)

jpwatts有正确的方法。您可能只需编写一些代码即可实现。