Django数据库查询结果集转换为JSON的正确方法
本文详解Django中将数据库查询结果集转换为JSON返回前端的两种方案。针对ORM查询,指出model_to_dict()仅适用于单条数据,多条数据需遍历集合后转换;针对原生SQL,演示如何通过cursor.description获取字段名并组装字典列表,同时处理时间类型格式化,确保返回数据符合前端JSON接收标准。
Django ORM查询结果转JSON的处理逻辑
在Django中执行SQL语句后,直接获取的结果集无法直接转换为JSON返回给前端,否则会导致报错。正确的做法是先将结果集遍历转换为字典列表,再序列化为JSON。需要特别注意,model_to_dict()函数仅能将结果集中的第一条数据转换为字典。如果查询条件是获取单条特定数据,直接使用model_to_dict()没有问题;但如果执行的是all()或filter()获取多条或全部数据,直接对该集合使用model_to_dict()会失败。此时,必须先遍历该集合,将每条数据转换为字典,最后再统一转换为JSON即可解决。
ORM查询示例代码
dic = {}
res = models.tables.objects.all().order_by('-id')
L = []
b = model_to_dict(res)
L.append(b)
dic['code'] = '1'
dic['message'] = ''
dic['result'] = L
return HttpResponse(json.dumps(dic, ensure_ascii=False))
查询结果的排序方法
order_by('-id'):该方法用于将查询结果集按照ID字段进行倒序排序。
原生SQL查询结果转JSON的实现
补充知识:Django执行SQL语句时,根据字段显示对应数据的具体实现方式。
原生SQL处理示例代码
L = []
cursor.execute(sql)
desc = cursor.description # 获取字段的描述,默认获取数据库字段名称
data_dict = [dict(zip([col[0] for col in desc], row)) for row in
cursor.fetchall()] # 列表表达式把数据组装起来
for online_dict in data_dict: # 判断如果时间类型要转出字符串,后期碰到什么类型不能转的在加
for key in online_dict:
if type(online_dict[key]) in (datetime, pymysql.TIMESTAMP, pymysql.DATE,
pymysql.TIME, YEAR):
online_dict[key] = online_dict[key].strftime(
"%Y-%m-%d %H:%M:%S")
else:
pass
L.append(online_dict)
conn.commit()
cursor.close()
conn.close()
dic['code'] = '2'
dic['message'] = ''
dic['result'] = L
return HttpResponse(json.dumps(dic, ensure_ascii=False))
总结
以上关于Django执行数据库查询后将结果集转换为JSON的内容分享完毕,希望能对大家有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









