我有以下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
有什么想法吗?
答案 0 :(得分:68)
我会添加一个稍微详细的答案。
值得注意的是QuerySet.values_list()
方法实际上并不返回列表,而是返回类型为django.db.models.query.ValuesListQuerySet
的对象,以便维护Django的延迟评估目标,即生成所需的数据库查询在评估对象之前,“list”实际上并未执行。
__repr__
方法,当打印出来时它看起来像一个列表,所以这个对象实际上不是一个列表并不总是很明显。
问题中的异常是由于自定义对象无法在JSON中序列化,因此您必须首先将其转换为列表,并使用...
my_list = list(self.get_queryset().values_list('code', flat=True))
...然后您可以使用...
将其转换为JSONjson_data = json.dumps(my_list)
您还必须将生成的JSON数据放在HttpResponse
对象中,apparently应该有Content-Type
application/json
,...
response = HttpResponse(json_data, content_type='application/json')
...然后你可以从你的功能中返回。
答案 1 :(得分:2)
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也很重要。