私は次のリストビューを持っています
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
何か案は ?
もう少し詳細な答えを追加します。
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-Type
がapplication/json
で、...
response = HttpResponse(json_data, content_type='application/json')
...その後、関数から戻ることができます。
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も重要です。