54

私は次のListViewを持っています

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

何か案は ?

4

2 に答える 2

71

Django の遅延評価の目標を維持するために、QuerySet.values_list()メソッドが実際にリストを返すのではなく、 type のオブジェクトを返すことに注意してください。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')

...関数から返すことができます。

于 2013-05-03T14:11:52.090 に答える