it-swarm.com.de

ist nicht JSON serialisierbar

Ich habe folgende ListView

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 folgenden Fehler:

[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 ?

47
tunaktunak

Ich werde eine etwas detailliertere Antwort hinzufügen.

Es ist erwähnenswert, dass die QuerySet.values_list() -Methode eigentlich keine Liste zurückgibt, sondern ein Objekt vom Typ Django.db.models.query.ValuesListQuerySet , um Djangos Ziel einer verzögerten Auswertung beizubehalten, dh die DB-Abfrage, die zum Generieren der 'Liste' erforderlich ist, wird erst dann ausgeführt, wenn das Objekt ausgewertet wurde.

Es ist jedoch etwas irritierend, dass dieses Objekt über eine benutzerdefinierte __repr__ - Methode verfügt, mit der es beim Ausdrucken wie eine Liste aussieht, sodass nicht immer klar ist, dass es sich bei dem Objekt nicht wirklich um eine Liste handelt.

Die Ausnahme in der Frage wird durch die Tatsache verursacht, dass benutzerdefinierte Objekte in JSON nicht serialisiert werden können, sodass Sie sie zuerst in eine Liste konvertieren müssen, mit ...

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

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

json_data = json.dumps(my_list)

Sie müssen auch die resultierenden JSON-Daten in ein HttpResponse -Objekt einfügen, das anscheinend einen Content-Type von application/json mit ...

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

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

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

problem behoben

auch mimetype ist wichtig.

2
tunaktunak