< Django object > 不是可序列化的 JSON

我有以下用于序列化查询集的代码:

def render_to_response(self, context, **response_kwargs):


return HttpResponse(json.simplejson.dumps(list(self.get_queryset())),
mimetype="application/json")

接下来是我的 get_quersety()

[{'product': <Product: hederello ()>, u'_id': u'9802', u'_source': {u'code': u'23981', u'facilities': [{u'facility': {u'name': {u'fr': u'G\xe9n\xe9ral', u'en': u'General'}, u'value': {u'fr': [u'bar', u'r\xe9ception ouverte 24h/24', u'chambres non-fumeurs', u'chambres familiales',.........]}]

我需要连载。但它说无法序列化 <Product: hederello ()>。因为列表由 django 对象和 dicts 组成。有什么想法吗?

313248 次浏览

simplejsonjson不能很好地处理 django 对象。

Django 的内置 序列化器只能序列化充满 Django 对象的查询集:

data = serializers.serialize('json', self.get_queryset())
return HttpResponse(data, content_type="application/json")

在您的示例中,self.get_queryset()包含了 django 对象和 dicts 的混合。

一种选择是去掉 self.get_queryset()中的模型实例,并使用 model_to_dict使用 dicts 替换它们:

from django.forms.models import model_to_dict


data = self.get_queryset()


for item in data:
item['product'] = model_to_dict(item['product'])


return HttpResponse(json.simplejson.dumps(data), mimetype="application/json")

希望能帮上忙。

首先,我向我的模型添加了一个 to _ dict 方法;

def to_dict(self):
return {"name": self.woo, "title": self.foo}

然后我有这个

class DjangoJSONEncoder(JSONEncoder):


def default(self, obj):
if isinstance(obj, models.Model):
return obj.to_dict()
return JSONEncoder.default(self, obj)




dumps = curry(dumps, cls=DjangoJSONEncoder)

最后使用这个类来序列化我的查询集。

def render_to_response(self, context, **response_kwargs):
return HttpResponse(dumps(self.get_queryset()))

效果不错

我发现,使用“ . values”方法可以非常简单地完成这项工作,该方法还提供命名字段:

result_list = list(my_queryset.values('first_named_field', 'second_named_field'))
return HttpResponse(json.dumps(result_list))

必须使用“ list”来获取可迭代的数据,因为“ value queryset”类型只有在选择为可迭代的时候才是 dict。

文件: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#values

来自1.9版本 抓到 Json 更容易,也更正式

from django.http import JsonResponse
from django.forms.models import model_to_dict




return JsonResponse(  model_to_dict(modelinstance) )

最简单的方法是使用 JsonResponse

对于查询集,您应该传递该查询集的 values列表,如下所示:

from django.http import JsonResponse


queryset = YourModel.objects.filter(some__filter="some value").values()
return JsonResponse({"models_to_return": list(queryset)})

我们的 js 程序员要求我向她返回精确的 JSON 格式数据,而不是 JSON 编码的字符串。

下面是解决方案(这将返回一个可以在浏览器中直接使用/查看的对象)

import json
from xxx.models import alert
from django.core import serializers


def test(request):
alert_list = alert.objects.all()


tmpJson = serializers.serialize("json",alert_list)
tmpObj = json.loads(tmpJson)


return HttpResponse(json.dumps(tmpObj))

在使用模型时解决这个问题的另一个好方法是使用 values()函数。

def returnResponse(date):
response = ScheduledDate.objects.filter(date__startswith=date).values()
return Response(response)


def get(self, request, **kwargs):
print('|||||||||||||||||||||')
get_user = request.user
lead_id = request.GET.get('lead_id', None)
print(get_user)
print(lead_id)
if not get_user or not lead_id :
return None
context = self.get_context_data(lead_id)
print('=====DATA===={}'.format(context))
return JsonResponse({'data': context})

对于 Django Model,请尝试:

users = User.objects.all()
return JsonResponse ({'data' : list(users)})