2015-10-30 49 views
-2
class UserProfile(AbstractUser): 
created_at = models.DateTimeField(auto_now_add=True) 
modified_at = models.DateTimeField(auto_now=True) 

它是UserProfile类。我想返回JSON

UserProfile型号延伸AbstractUser

def get_rank(request): 
    users1 = UserProfile.objects.all().order_by('created_at') 
    # below code works but variable 'users1' don't work. 
    # I want users to JSON. ex) users 
    users = '[{"item":"NEFUS"},{"item":"Layer7"},{"item":"Unifox"},{"item":"Focus"},{"item":"Frs"}]' 
    return HttpResponse(users , content_type='application/json') 

此代码不起作用,我不知道为什么。

德变量users的作品。但变量user1不起作用。

function ajax_get_rank() { 
    var temp = new XMLHttpRequest(); 
    temp.open("GET","/get_rank/"); 
    temp.onreadystatechange = function() { 
     if (temp.readyState === 4 && temp.status === 200) { 
      get_rank(temp.responseText); 
     } 
    } 
    temp.send(); 
} 

这是AJAX代码。

function get_rank(rank_array_temp) { 
    var temp = JSON.parse(rank_array_temp); 
    for(var i = 0 ; i < temp.length; i++) { 
     var div_temp = document.createElement("div"); 
     div_temp.className = "rank" 
     var out = ""; 
     out += "\ 
      <div class = 'rank'>\ 
       <span class = 'grade'>\ 
        <span>"+parseInt(i+1)+".</span>\ 
       </span>\ 
       <span class = 'item_name'>\ 
        <span>"+temp[i].item+"</span>\ 
       </span>\ 
      </div>\ 
     "; 

     div_temp.innerHTML = out; 
     rank_list.appendChild(div_temp); 
    } 
} 

这是主要的JavaScript代码。

任何帮助,将不胜感激。

+1

你还没有描述什么是行不通的。你传递一个硬编码的字符串;你究竟想要做什么? –

+0

'user1'输出是什么样的? – Tgsmith61591

+0

user1 => [等] – Leop0ld

回答

1

你不能直接序列化django模型对象,这样你会得到TypeError: queryset is not JSON serializable错误。

但是你可以使用values得到你想要显示字段的集合,然后将其序列化:

profiles = UserProfile.objects.all().order_by('created_at') \ 
            .values('field1', 'field2') 

users1 = json.dumps(profiles) 

注意领域,如DateTimeDate等,都没有JSON序列化。你需要的是:

from django.core.serializers.json import DjangoJSONEncoder 
users1 = json.dumps(profiles, cls=DjangoJSONEncoder) 
+0

我想返回 {0:“Nefus”,1:“Unifox”,2:“Layer7”等} 或 { “项目”:“Nefus”,“项目”:“Unifox”,“项目”:“Layer7”等} 如何做到这一点? – Leop0ld

+0

我不明白你的评论字典中的那些值是什么,也不是整数。 –

+0

对不起,我做得不好..... plz了解 我想返回 '[{“item”:“Unifox”},{“item”:“Layer7”},{“item”:“ Nefus“}等]' – Leop0ld

0

序列化/反序列化对象直接JSON是不是一个好办法实际上自从:

  1. 对象都会有问题,因为他们没有关于如何序列化特定的描述符object to JSON
  2. 使用valuesvalues_list将尝试转换特殊类型(如Decimal)时出现问题,因为JSON没有Decimal类型。

可能的解决方案:

  1. 硬盘的方式是创建在python列表或字典,然后序列化此。你必须分析特殊类型的基本类型的也是有效的类型JSON数据,如转换Decimalfloat

    import json 
    height = Decimal("1.78") 
    my_dict = {"Name": "Jason", "Age": 16, height: float(height)} 
    json.loads(my_dict) 
    

或者像@ShangWang提到的,你可以使用DjangoJSONEncoder编码蟒蛇特定类型没有得到错误。

  1. 使用Django serializers进行序列化/反序列化。你可以专门化哪些领域将被序列化。

    from django.core import serializers 
    data = serializers.serialize("json", SomeModel.objects.all()) 
    
    data = serializers.serialize('json', SomeModel.objects.all(), fields=('name','size')) 
    

Django的串行器更容易使用,因为它们将系列化任何有效的Python类型适当的JSON类型。 Django的序列化

输出将是这样的:

[ 
    { 
     "pk": "4b678b301dfd8a4e0dad910de3ae245b", 
     "model": "sessions.session", 
     "fields": { 
      "expire_date": "2013-01-16T08:16:59.844Z", 
      ... 
     } 
    } 
] 

所以,你可以从每个JSON对象的fields键获取字段和值。您可以查看文档以获取更多信息。