最近两天一直在做如何从model中获取数据库中的数据,然后把数据变成json数据传给前台。
from roomhourse.models import v_xs
student = v_xs.object.all()
#<class 'django.db.model.query.QuerySet'>
return HttpResponse(student)
结果不出意外的出错了,传的不是json,而是QuerySet(查询集),
后来用了
import json
student = json.dumps(student,ensure_ascii=False)
return HttpResponse(student)
后来就开始报xxx is not JSON serializable之类的问题,这个主要原因还是因为你查询的model里面可能有外键的原因,在你查询后,外键也在其中,但是外键其实也是一个查询集,最简单的方法就是外键不要传给前端,不过还是可以有更高端的方法,如下:
自己创建一个类,继承json,来添加自定义类的处理方法
class JsonXS(json.JSONENcoder):
def default(self, obj):
if isinstance(obj,v_xs):
return obj.__str__()
return json.JSONEncoder.default(self, obj)
student = json.dumps(student, cls= JsonXS, ensure_ascii=False)
待定
或者用自定义转json的方法
在models中:
def JsonXS(self):
return {....'roomxs':self.roomxs,...}
在view中:
def toDicts(objs):
json_str = []
for o in objs:
json_str.append(o.JsonXS())
return json_str
已测,可以执行
或者直接导入了serializers
from django.core import serializers
studentman = serializers.serialize("json",studentman)
return HttpResponse(studentmanage)
已测,可以执行
以上三个方法应该都是可以传json值的,我只测试了两种方法,第一种没有测试
*************************************************************************************************************************************************
其实python中json就有自带的方法,json.dumps()
dumps是将dict转化成str格式,loads是将str转化成dict格式
参看连接:Django model,QuerySet 序列化成json的方法 - CSDN博客