web-dev-qa-db-ja.com

JSONシリアライズ可能ではありません

私は次のリストビューを持っています

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

しかし、私は次のエラーが発生します:

[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

何か案は ?

47
tunaktunak

もう少し詳細な答えを追加します。

QuerySet.values_list() メソッドは実際にはリストを返さないが、遅延評価のDjangoの目標、つまり生成に必要なDBクエリを維持するために、Django.db.models.query.ValuesListQuerySet型のオブジェクトを返すことに注意してください「リスト」は、オブジェクトが評価されるまで実際には実行されません。

多少いらいらすることに、このオブジェクトにはカスタム__repr__メソッドがあり、印刷するとリストのように見えるため、オブジェクトが実際にリストではないことは必ずしも明らかではありません。

質問の例外は、カスタムオブジェクトをJSONでシリアル化できないため、最初にリストに変換する必要があるためです。

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

...次に、JSONに変換できます...

json_data = json.dumps(my_list)

また、結果のJSONデータをHttpResponseオブジェクトに配置する必要があります。このオブジェクトは、 明らかに で、Content-Typeapplication/jsonで、...

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

...その後、関数から戻ることができます。

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

問題を修正しました

mimetypeも重要です。

2
tunaktunak