Django2.1.7 查询数据返回json格式的实现


Posted in Python onDecember 29, 2020

需求问题

在日常工作中,对于前端发送过来的请求,后端django大部分都是采用json格式返回,也有采用模板返回视图的方式。

在模板返回视图的方式的确很方便,但是如果涉及到动静分离、ajax请求这类,django就只能返回json格式的数据了。

那么这里就带来了一个问题,如何将django从数据库模型类中查询的数据以json格式放回前端。

然后前端如果获取读取返回过来的数据呢?

环境说明

  • 前端采用jquery发送ajax请求
  • python 3.7.2
  • django 2.1.7

示例说明

这次示例首先写一个简单的页面发送ajax请求,然后后端分如何返回多行数据如果返回查询对象进行示例说明。

前端代码

首先编写一个简单的前端页面test_ajax.html如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script src="/static/js/jquery-3.0.0.min.js"></script>
  <script>
    $(function () {
      $('#search_server').click(function () {
        // 获取服务器名称
        var server_name = $('#server_name').val();
        console.log('server_name = ' + server_name);
 
        // 发送ajax post请求
        $.ajax({
          url: "/assetinfo/test_ajax",
          type: 'POST',
          data: {
            "tag": "search_project",
            "server_name": server_name,
          },
          dataType: "json",
          async: false,
          // 请求成功调用的函数
          success: function (data) {
            console.log(data);
          },
          // 请求出错时调用的函数
          error: function () {
            alert("查询项目数据发送失败");
          }
 
        })
      })
    })
  </script>
</head>
<body>
 
<input type="text" id="server_name">
<button id="search_server">提交</button>
 
 
</body>
</html>

实现的功能很简单,只是获取输入框的内容,然后点击提交按钮发送一个ajax的post请求即可。

后台直接查询服务器信息,然后返回多条json数据

实现类视图代码如下:

from django.core import serializers
from django.http import HttpResponse
from assetinfo.models import ServerInfo
 
# ex: /assetinfo/test_ajax
class TestAjax(View):
 
  def get(self,request):
    """显示html页面"""
    return render(request,'assetinfo/test_ajax.html')
 
  def post(self,request):
    """接收处理ajax的post请求"""
    servers = ServerInfo.objects.all() # 查询服务器信息
    json_data = serializers.serialize('json', servers) # 将查询结果进行json序列化
    return HttpResponse(json_data, content_type="application/json") # 返回json数据

在后台代码我没有做获取post请求的参数,再进行的参数查询的操作,这样只演示如何返回json格式数据。

其中获取post请求参数的方式很简单,依然是request.POST.get('参数名')即可。

浏览器测试功能如下:

Django2.1.7 查询数据返回json格式的实现

可以从浏览器的控制台看到后端返回过来的结果数据。

但是这样直接返回跟前端没有任务约束是不好的,那么下面来增加一下与前端交互的格式约束。

前后端约束返回数据格式

{"resCode": '0', "message": 'success',"data": []}

按照这个约束格式,那么查询的结果应该放在data的数组中。下面来改后端视图代码。

后端按照约束格式返回json数据

from django.core import serializers
from django.http.response import JsonResponse
from assetinfo.models import ServerInfo
 
# ex: /assetinfo/test_ajax
class TestAjax(View):
 
  def get(self,request):
    """显示html页面"""
    return render(request,'assetinfo/test_ajax.html')
 
  def post(self,request):
    """接收处理ajax的post请求"""
 
    # 和前端约定的返回格式
    result = {"resCode": '0', "message": 'success',"data": []}
 
    # 查询服务器信息
    servers = ServerInfo.objects.all()
 
    # 序列化为 Python 对象
    result["data"] = serializers.serialize('python', servers)
 
    return JsonResponse(result)

浏览器测试如下:

Django2.1.7 查询数据返回json格式的实现

这样子返回前端的话,每条数据对象包含 fields,model,pk三个对象,分别代表字段、模型、主键,我更想要一个只包含所有字段的字典对象。

后端修改每个model对象转化为dict字典对象

from django.core import serializers
from django.http.response import JsonResponse
from django.forms.models import model_to_dict
 
# ex: /assetinfo/test_ajax
class TestAjax(View):
 
  def get(self,request):
    """显示html页面"""
    return render(request,'assetinfo/test_ajax.html')
 
  def post(self,request):
    """接收处理ajax的post请求"""
 
    # 和前端约定的返回格式
    result = {"resCode": '0', "message": 'success',"data": []}
    # 查询服务器信息
    servers = ServerInfo.objects.all()
 
    # 将model对象逐个转为dict字典,然后设置到data的list中
    for server in servers:
      server = model_to_dict(server) # model对象转dict字典
      server['server_used_type_id'] = serializers.serialize('python', server['server_used_type_id']) # 外键模型对象需要序列化,或者去除不传递
      result["data"].append(server)
 
    return JsonResponse(result)

浏览器测试如下:

Django2.1.7 查询数据返回json格式的实现

可以看到,这样传递给前端就是字典对象了。

最后,再给出前端js遍历json格式数据的示例。

前端遍历返回的json格式数据示例

<script>
    $(function () {
      $('#search_server').click(function () {
        ....
 
        // 发送ajax post请求
        $.ajax({
          url: "/assetinfo/test_ajax",
          type: 'POST',
          data: {
            "tag": "search_project",
            "server_name": server_name,
          },
          dataType: "json",
          async: false,
          // 请求成功调用的函数
          success: function (res) {
            {#console.log(res.data);#}
            // 遍历data信息
            for(var i=0;i<res.data.length;i++){
              console.log(res.data[i]);
              console.log(res.data[i]['server_hostname']);
              console.log(res.data[i]['server_internet_ip']);
              console.log(res.data[i]['server_intranet_ip']);
            }
          },
          // 请求出错时调用的函数
          error: function () {
            alert("查询项目数据发送失败");
          }
 
        })
      })
    })
  </script>

浏览器显示如下:

Django2.1.7 查询数据返回json格式的实现

到此这篇关于Django2.1.7 查询数据返回json格式的实现的文章就介绍到这了,更多相关Django返回json格式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中用max()方法求最大值的介绍
May 15 Python
Python中的字典与成员运算符初步探究
Oct 13 Python
简介Python的collections模块中defaultdict类型的用法
Jul 07 Python
分分钟入门python语言
Mar 20 Python
python使用for循环计算0-100的整数的和方法
Feb 01 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
Aug 27 Python
python修改文件内容的3种方法详解
Nov 15 Python
Django之form组件自动校验数据实现
Jan 14 Python
Python中sorted()排序与字母大小写的问题
Jan 14 Python
windows python3安装Jupyter Notebooks教程
Apr 13 Python
增大python字体的方法步骤
Jul 05 Python
Python打印不合法的文件名
Jul 31 Python
Python 获取异常(Exception)信息的几种方法
Dec 29 #Python
python 将html转换为pdf的几种方法
Dec 29 #Python
python实现ping命令小程序
Dec 28 #Python
如何用python 操作zookeeper
Dec 28 #Python
Pycharm在指定目录下生成文件和删除文件的实现
Dec 28 #Python
Python用Jira库来操作Jira
Dec 28 #Python
python性能测试工具locust的使用
Dec 28 #Python
You might like
域名查询代码公布
2006/10/09 PHP
PHP教程 基本语法
2009/10/23 PHP
PHP spl_autoload_register实现自动加载研究
2011/12/06 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
javascript延时重复执行函数 lLoopRun.js
2007/06/29 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
Jquery的each里用return true或false代替break或continue
2014/05/21 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
详解React 元素渲染
2020/07/07 Javascript
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
python Django连接MySQL数据库做增删改查
2013/11/07 Python
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
Python中的匿名函数使用简介
2015/04/27 Python
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
浅析Python中signal包的使用
2015/11/13 Python
python得到单词模式的示例
2018/10/15 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
John Hardy官方网站:手工设计首饰的奢侈品牌
2017/07/05 全球购物
澳大利亚足球鞋和服装购物网站:Ultra Football
2018/10/11 全球购物
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
委托证明书
2014/09/17 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
运动会通讯稿600字
2015/07/20 职场文书
Django项目如何正确配置日志(logging)
2021/04/29 Python
Golang中interface{}转为数组的操作
2021/04/30 Golang
Python上下文管理器Content Manager
2021/06/26 Python
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技