2015-10-30 2 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

Как выглядит 'users1'? – 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) 

Обратите внимание, что поля, такие как DateTime, Date и т.д., не JSon сериализации. Что вам нужно:

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

Я хочу вернуть {0: «Nefus», 1: «Unifox», 2: «Layer7» и т. Д.) или { «item»: «Nefus», «item»: «Unifox», «item»: «Layer7» и т. д.) , как это сделать? – Leop0ld

+0

Я не понимаю, каковы эти значения в словаре в вашем комментарии, а также целые числа. –

+0

извините, я не очень хорошо ..... plz понимаю Я хочу вернуть '[{"item": "Unifox"}, {"item": "Layer7"}, {"item": " Nefus "} и т. Д.] ' – Leop0ld

0

Serialize/де-сериализации объектов непосредственно JSon не является хорошим способом практически с:

  1. Объекты будут иметь проблемы, так как у них нет дескриптора о том, как сериализовать, что конкретные объект для JSON
  2. Использование values или values_list будет иметь проблемы при попытке конвертировать специальные типы, такие как Decimal, поскольку JSON не имеет десятичного типа.

Возможные решения:

  1. Трудный путь создает список или словарь в Python, а затем сериализуете. Вы должны анализировать специальные типы для основных типов, которые также являются допустимыми типами данных для JSON, как преобразование Decimal в float

    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')) 
    

Джанго сериализаторов проще в использовании, так как они будут сериализовать любой допустимый тип питона для соответствующего типа JSON.

Вывод Джанго сериализатора будет что-то вроде этого:

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

Таким образом, вы можете получить поля и значение из fields ключа каждого объекта JSON. Вы можете проверить документы для получения дополнительной информации.

Смежные вопросы