我正在尝试跨越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请求。
我错过了什么吗?有没有一种简单的方法可以在一个响应中获得两者?谢谢!
答案 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有正确的方法。您可能只需编写一些代码即可实现。