2015-10-30 51 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鍵獲取字段和值。您可以查看文檔以獲取更多信息。