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.ValuesListQuerySet
Om 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 HttpResponse
Object, welke, blijkbaar , zou een Content-Type
van 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.