54

我有以下列表视图

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

值得注意的是,该QuerySet.values_list()方法实际上并没有返回一个列表,而是一个类型的对象,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')

...然后您可以从您的函数中返回。

于 2013-05-03T14:11:52.090 回答
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 也很重要。

于 2013-05-02T11:22:51.553 回答