2013-05-02 16 views
41

Ho la seguente ListViewnon è JSON serializzabile

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

ma ottengo errore seguente:

[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 

Tutte le idee?

+0

Che cos'è ** Paese ** modello? – sergzach

+0

qual è il traceback? – User

+1

Funziona se si cambia la linea in: 'return json.dumps (list (self.get_queryset(). Values_list ('code', flat = True)))'? – Aya

risposta

67

Aggiungerò una risposta leggermente più dettagliata.

Vale la pena notare che il metodo QuerySet.values_list() non restituisce effettivamente un elenco, ma un oggetto di tipo django.db.models.query.ValuesListQuerySet, al fine di mantenere l'obiettivo di Django della valutazione lazy, ovvero la query DB richiesta per generare l''elenco' non è effettivamente eseguito fino a quando l'oggetto non viene valutato.

Un po 'irritante, questo oggetto ha un metodo personalizzato __repr__ che lo fa apparire come un elenco quando viene stampato, quindi non è sempre ovvio che l'oggetto non sia realmente una lista.

L'eccezione in questione è causato dal fatto che gli oggetti personalizzati non possono essere serializzato in JSON, quindi dovrete per convertirlo in un elenco prima, con ...

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

... quindi è possibile convertirlo in JSON con ...

json_data = json.dumps(my_list) 

dovrete anche per inserire i dati JSON risultanti in un oggetto HttpResponse, che, apparently, dovrebbe avere un Content-Type di application/json, con ...

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

... che è possibile quindi tornare dalla propria funzione.

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

risolto il problema

anche tipomime è importante.

Problemi correlati