2013-05-02 4 views
41

У меня есть следующие ListViewне JSON сериализации

import json 
class CountryListView(ListView): 
    model = Country 

    def render_to_response(self, context, **response_kwargs): 

     return json.dumps(self.get_queryset().values_list('code', flat=True)) 

Но я получаю следующее сообщение об ошибке:

[u'ae', u'ag', u'ai', u'al', u'am', 
u'ao', u'ar', u'at', u'au', u'aw', 
u'az', u'ba', u'bb', u'bd', u'be', u'bg', 
u'bh', u'bl', u'bm', u'bn', '...(remaining elements truncated)...'] 
is not JSON serializable 

Любые идеи?

+0

Что такое ** Страна ** модель? – sergzach

+0

Что такое трассировка? – User

+1

Это работает, если вы меняете строку на: 'return json.dumps (list (self.get_queryset(). Values_list ('code', flat = True)))'? – Aya

ответ

67

Я добавлю немного более подробный ответ.

Следует отметить, что метод QuerySet.values_list() фактически не возвращает список, а объект типа django.db.models.query.ValuesListQuerySet, чтобы сохранить цель Django для ленивой оценки, то есть запрос БД, необходимый для создания «списка», не является фактически выполняется до тех пор, пока объект не будет оценен.

В некоторой степени раздражающе, однако, этот объект имеет настраиваемый метод __repr__, который делает его похожим на список при распечатке, поэтому не всегда очевидно, что объект на самом деле не является списком.

Исключение в этом вопросе вызвана тем, что пользовательские объекты не могут быть сериализации в JSON, так что вы должны преобразовать его в список первой, с ...

my_list = list(self.get_queryset().values_list('code', flat=True)) 

... то вы можете преобразовать его в формат JSON с ...

json_data = json.dumps(my_list) 

вы также должны поместить полученные данные в формате JSON в HttpResponse объект, который, apparently, должны иметь Content-Type из application/json, с ...

response = HttpResponse(json_data, content_type='application/json') 

... который затем можно вернуть из вашей функции.

2
class CountryListView(ListView): 
    model = Country 

    def render_to_response(self, context, **response_kwargs): 

     return HttpResponse(json.dumps(list(self.get_queryset().values_list('code', flat=True))),mimetype="application/json") 

Исправлена ​​проблема

также MimeType важно.

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