is niet JSON serialiseerbaar

Ik heb de volgende lijstweergave

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

Maar ik krijg de volgende foutmelding:

[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

alle ideeën?


Antwoord 1, Autoriteit 100%

Het is de moeite waard om op te merken dat de QuerySet.values_list()methode retourneert geen lijst, maar een object van het type django.db.models.query.ValuesListQuerySetOm Django’s doel van luie evaluatie te behouden, dwz de vereiste DB-query die nodig is om de ‘lijst’ te genereren, wordt daadwerkelijk uitgevoerd totdat het object wordt geëvalueerd.

Enigszins irriterend, hoewel dit object een aangepaste __repr__-methode heeft, waardoor het lijkt op een lijst wanneer deze wordt afgedrukt, is het niet altijd voor de hand liggend dat het object niet echt een lijst is.

De uitzondering in de vraag wordt veroorzaakt door het feit dat aangepaste objecten niet kunnen worden geserialiseerd in JSON, zodat u het eerst naar een lijst moet converteren, met …

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

… dan kunt u deze converteren naar JSON met …

json_data = json.dumps(my_list)

U moet ook de resulterende JSON-gegevens plaatsen in een HttpResponseObject, welke, blijkbaar , zou een Content-Typevan application/json, met …

hebben

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

… die u vervolgens kunt terugkeren van uw functie.


Antwoord 2, Autoriteit 3%

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

Vaste het probleem

ook mimetype is belangrijk.

Other episodes