2013-05-02 6 views
41

Ich habe folgendes Listviewist nicht JSON serializable

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

aber ich bekomme folgende Fehlermeldung:

[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 

Irgendwelche Ideen?

+0

Was ist ** Country ** Modell? – sergzach

+0

Was ist die Rückverfolgung? – User

+1

Funktioniert es, wenn Sie die Zeile ändern in: 'return json.dumps (Liste (self.get_queryset(). Values_list ('code', flat = True))) '? – Aya

Antwort

67

Ich werde eine etwas detailliertere Antwort hinzufügen.

Es ist erwähnenswert, dass die Methode QuerySet.values_list() nicht tatsächlich eine Liste zurückgibt, sondern ein Objekt vom Typ django.db.models.query.ValuesListQuerySet, um Djangos Ziel der Lazy-Evaluierung beizubehalten, dh die zum Erzeugen der 'Liste' erforderliche DB-Abfrage nicht tatsächlich durchgeführt, bis das Objekt ausgewertet wird.

Etwas irritierend, aber dieses Objekt hat eine benutzerdefinierte __repr__ Methode, die es wie eine Liste aussieht, wenn gedruckt, so ist es nicht immer offensichtlich, dass das Objekt nicht wirklich eine Liste ist.

Die Ausnahme in der Frage durch die Tatsache verursacht wird, dass keine benutzerdefinierten Objekte in JSON serialisiert werden können, so dass Sie es zuerst in eine Liste konvertieren müssen würden, mit ...

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

... dann können Sie es zu JSON konvertieren mit ...

json_data = json.dumps(my_list) 

Sie werden auch die daraus resultierenden JSON-Daten in einem HttpResponse Objekt platzieren müssen, die apparently, sollte eine Content-Type von application/json haben, mit ...

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

... die Sie dann von Ihrer Funktion zurückkehren können.

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

das Problem behoben

auch MIME-Typ wichtig ist.

Verwandte Themen