zoukankan      html  css  js  c++  java
  • django-将数据库数据转换成JSON格式(ORM和SQL两种情况)

    最近打算搞一个自动化运维平台,所以在看Django的知识。

    在实际项目开发中,遇到一个小问题:前后端发生数据交互主流采用的是JSON。前端传数据到服务器端比较简单,稍微麻烦的是服务器端传JSON到前端。

    首先数据是从数据库中获取的,Django默认使用的是ORM技术,但是作为一个运维人员,我其实比较反感这类抽象出来的API。因为尽管它对于开发人员来说,将数据库的表抽象成了一个对象,便于开发,不需要写SQL语句,但是这也是后期程序造成性能瓶颈的罪魁祸首(再做一次故障处理时,遇到一条70几行的SQL语句。。。。。),另外对于一个运维人员来说,纯SQL是基本能力,再次去学习ORM的语法,无形中又增加了学习成本。

    不管怎么说,这次的主题是将从数据库获取数据转换成JSON,下面会将用ORM和SQL两种方式都拿出来分享。

    1.采用Django Model层,ORM技术  转换成JSON格式

    1 def getdata(request):
    2    # 使用ORM
    3    # all()返回的是QuerySet 数据类型;values()返回的是ValuesQuerySet 数据类型
    4    data = models.VM.objects.values('id', 'ip', 'host', 'username')
    5    data = serializers.serialize("json", tomcats)
    6    return JsonResponse(list(data), safe=False)

    2.完全弃用Django Model层,纯SQL  转换成JSON格式

    1 def getdata(request):
    2 # 使用SQL
    3     with connection.cursor() as cursor:
    4         cursor.execute('select id, machine, tomcathome, ipaddress, description from tomcatData')
    5         data = dictfetchall(cursor)
    6     return JsonResponse(data, safe=False, json_dumps_params={'ensure_ascii': False})
    1 # 将返回结果转换成字典
    2 def dictfetchall(cursor):
    3     "Return all rows from a cursor as a dict"
    4     columns = [col[0] for col in cursor.description]
    5     return [
    6         dict(zip(columns, row))
    7         for row in cursor.fetchall()
    8     ]

    JsonResponse 对象:

    class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)

    这个类是HttpRespon的子类,它主要和父类的区别在于:

    1.它的默认Content-Type 被设置为: application/json

    2.第一个参数,data应该是一个字典类型,当 safe 这个参数被设置为:False ,那data可以填入任何能被转换为JSON格式的对象,比如list, tuple, set。 默认的safe 参数是 True. 如果你传入的data数据类型不是字典类型,那么它就会抛出 TypeError的异常。

    3.json_dumps_params参数是一个字典,它将调用json.dumps()方法并将字典中的参数传入给该方法。

    通过以上的解释,上面两个方法的JsonResponse()里面传入的参数就很清晰明了。

    这样数据就会以JSON格式传入到前端,前端就能用AJAX获取到,并进行处理或者展示了。



    作者:最后一个亮亮 出处: https://www.cnblogs.com/swim/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】
  • 相关阅读:
    Runtime类与Process类
    runtime 得到jvm的内存空间信息
    random 类的实际应用
    NumberFormat类实际应用
    java 国际化程序实现
    Calendar类取得系统的当前日期
    demo-文件复制
    用递归方法 在列表中 使用二分查找。找一个数字
    第一个 购物车程序
    练习题1 —— 全局替换程序
  • 原文地址:https://www.cnblogs.com/swim/p/7132111.html
Copyright © 2011-2022 走看看