一尘不染

不可序列化为JSON

django

我有以下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

有任何想法吗 ?


阅读 477

收藏
2020-04-01

共1个答案

一尘不染

我将添加一个更详细的答案。

值得注意的是,该QuerySet.values_list()方法实际上并不返回列表,而是返回一个类型为object的对象,django.db.models.query.ValuesListQuerySet以维持Django的惰性求值目标,即,直到该对象被创建时,才真正执行生成“列表”所需的数据库查询评估。

不过,有些恼人的是,此对象有一个自定义__repr__方法,使它在打印时看起来像一个列表,因此,并非总是很明显该对象实际上不是列表。

问题中的例外是由于无法在JSON中序列化自定义对象,因此你必须首先使用…将其转换为列表。

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

…然后你可以使用…将其转换为JSON …

json_data = json.dumps(my_list)

你还必须将生成的JSON数据放在一个HttpResponse对象中,该对象显然应该具有Content-Typeof application/json,并带有…

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

…然后你可以从函数中返回。

2020-04-01