一、ORM查询优化

(一)only与defer

(1)only

  1. 括号内放字段,返回包含着一个个数据对象的queryset对象,数据对象中只含有该字段值
  2. 也可以查询其他字段,但是数据来源是重新去数据库中查找,效率极低
res = models.Book.objects.only('title')

(2)defer

  1. defer查询出来的对象包含除了该字段以外的其他字段值
  2. 也可以查询其他字段,但是数据来源是重新去数据库中查找获取该字段值
res = models.Book.objects.defer('title')

(二)select_related与prefatch_related

(1)select_related

  1. 括号内只能放外键字段,外键类型只能是一对一、一对多,不能是多对多
  2. 查询出来的是原表和外键关联的表,因此查询外键关联的表时不需要再去数据库访问
  3. 当表数据很多时,比较耗时
res = models.Book.objects.select_related('publish')
for i in res:
    # print(i.title)
    print(i.publish)

(2)prefatch_related

  1. 括号内只能放外键字段(可以放多个),会按步骤查询多张表,相当于子查询
  2. 访问数据库次数多,每多放一个外键字段,就会多访问一次数据库
res = models.Book.objects.prefetch_related('publish','authors')
for i in res:
    # print(i.title)
    print(i.publish)

二、MTV与MVC模型

  1. django自称为是MTV框架,其实本质是MVC
  2. MTV:把web应用分为模型(Model)、模板(Template)、视图(View)三层, 他们之间以一种插件似的,松耦合的方式连接在一起。
    1. Model(模型):负责业务对象与数据库的对象(ORM)
    2. Template(模版):负责如何把页面展示给用户
    3. View(视图):负责业务逻辑,并在适当的时候调用Model和Template
  3. MVC:把web应用分为模型(Model)、控制器(Control)、视图(View)三层, 他们之间以一种插件似的,松耦合的方式连接在一起。
    1. 模型负责业务对象与数据库的对象(ORM)
    2. 视图负责与用户的交互(页面)
    3. 控制器(C)接受用户的输入调用模型和视图完成用户的请求。

三、choices参数

  1. .get_字段名_display:获取数字对应的值得统一句式,否则只能获得数字
  2. 没有对应关系,获取的也还是数字
# models.py
class User(models.Model):
    username = models.CharField(max_length=64)
    password = models.IntegerField()
    gender_choices = (
        (1,'男'),
        (2,'女'),
        (3,'其他'),
    )
    gender = models.IntegerField(choices=gender_choices)

# test.py
user_obj = models.User.objects.get(pk=1)
user_obj1 = models.User.objects.get(pk=4)

print(user_obj.gender)  # 1
print(user_obj1.gender)  # 4
print(user_obj.get_gender_display())  # 男
print(user_obj1.get_gender_display())  # 4

四、AJAX

(一)JSON和XML

(1)什么是Json

  1. JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  2. JSON 是轻量级的文本数据交换格式
  3. JSON 独立于语言 *
  4. JSON 具有自我描述性,更易理解

JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。

(2)JSON的用法

  • JavaScript
  1. 序列化:JSON.stringify()
  2. 反序列化:JSON.parse()
  • Python

    1. 序列化:json.dumps()
    2. 反序列化:json.loads()

(3)XML

  1. XML也是一门标记语言,可应用于写配置文件和前端页面(odoo框架,用于开发企业内部管理软件,依赖于python2)
  2. JSON 格式于2001年由 Douglas Crockford 提出,目的就是取代繁琐笨重的 XML 格式

(二)什么是AJAX

  1. AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)
  2. 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
  3. 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求,比如注册时用户名查重
  4. AJAX 不是新的编程语言,而是一种使用现有标准的新方法 ,不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行
  5. 优点: 在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容(异步交互)

(三)jQuery实现AJAX

  1. $.ajax({}):开启AJAX的语法句式
  2. url:数据提交的后端地址,不写就是往当前页面提交,和actions的作用一样
  3. type:请求的方式,默认get请求
  4. data:提交给后端数据,此时HttpResponse对象返回的不是页面,而是与data交互
  5. success:function(data){}:固定写法,参数data为后端返回的数据
  6. is_ajax():是否是ajax请求,返回布尔值
<!--xxx.html-->
<script>
    $('#d4').on('click',function () {
        // 开启ajax语法
        $.ajax({
            url:'',  // 数据提交的后端地址  不写就是往当前页面提交  也可以写后缀 也可以写全称  跟actions一样
            type:'post',  // 提交方式  默认是get请求
            data:{'i1':$('#d1').val(),'i2':$('#d2').val()},  // 提交的数据
            success:function (data) {  // 形参data就是异步提交之后后端返回结果
                $('#d3').val(data)  // 回调机制需要做的事情#
                alert(data)
            }
        })
    })
</script>
# views.py
def xxx(request):
    # print(request.is_ajax())  # 判断当前请求是否是ajax请求
    # print(request.POST)  # ajax发送的post请求 普通的键值对也在request.POST中获取
    if request.is_ajax():
        # i1 = request.POST.get('i1')
        # i2 = request.POST.get('i2')
        # res = int(i1) + int(i2)
        # return HttpResponse(res)  # 给异步回调函数 success
        # return render(request,'xxx.html')  # 给异步回调函数 success
        return redirect('https://www.baidu.com')  # 给异步回调函数 success
    return render(request,'xxx.html')

(四)前后端传输数据编码格式

(1)urlencoded格式

  1. 对应的数据格式为username=wick&password=123,django后端会自动解析并封装到request.POST中
  2. ajax和form表单中默认的编码格式

(2)formdata格式

  1. 用于发送文件,该格式的数据浏览器上无法查看,django后会自动识别并封装到request.FILES中
  2. ajax和form表单都可以发送

(3)application/json格式

form表单无法发送该格式数据,只能通过ajax

(五)Ajax传输json格式数据和文件数据

(1)传输json格式数据

  1. django后端不会对json格式的数据进行处理,需要手动序列化与反序列化,
  2. contentType:'application/json',:设置数据类型格式
  3. data:JSON.stringify({'username':'jason','password':'123'}),:序列化数据
<script>
    // 传json格式的数据
    $('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',
            contentType:'application/json',
            data:JSON.stringify({'username':'jason','password':'123'}),
            success:function (data) {
                alert(123)
            }
        })
</script>

(2)传输文件数据

  1. 生成内置对象:var MyFormData = new FormData();,该对象可以传输文件数据,也支持普通键值对
  2. append:添加普通键值或者文件数据
  3. $('#d1')[0].files[0]:input框中文件对象
  4. contentType:false,:MyFormData对象内部自带编码 django后端能够识别
  5. processData:false,:不需要处理数据
<script>
    // 传文件
    $('#d1').click(function () {
        // 先生成一个内置对象
        var MyFormData = new FormData();
        // 1. 先添加普通的键值
        MyFormData.append('username','jason');  // 添加了一组普通的简直对
        MyFormData.append('password','123');
        MyFormData.append('hobby',['read','run']);
        // 2. 添加文件数据
        MyFormData.append('myfile',$('#d2')[0].files[0]);  // 如何获取input框中文件对象$('#d1')[0].files[0]
        $.ajax({
            url:'',
            type:'post',
            data:MyFormData,

            // 发送文件必须要指定的两个参数
            contentType:false,  // MyFormData对象内部自带编码 django后端能够识别
            processData:false,  // 不要处理数据

            success:function (data) {
            }
        })
    })
</script>

(六)序列化(serializers)

  1. 可以把orm查询出来的数据对象中的所有字段值自动整合成一个字典发送给客户端,方便数据交互
  2. 字典包括表名、主键值、封装了字段对应值的字典
def ser(request):
    # 1. 拿到用户表里面的所有的用户对象
    user_list=models.User.objects.all()
    # 2. 导入内置序列化模块
    from django.core import serializers
    # 3. 调用该模块下的方法,第一个参数是你想以什么样的方式序列化你的数据
    ret=serializers.serialize('json',user_list)
    return HttpResponse(ret)

(day55)七、查询优化、MTV和MCV、choices、AJAX、序列化的更多相关文章

  1. django基础之FBV与CBV,ajax序列化补充,Form表单

    目录: FBV与CBV ajax序列化补充 Form表单(一) 一.FBV与CBV 1.什么是FBV.CBV? django书写view时,支持两种格式写法,FBV(function bases vi ...

  2. Django Ajax序列化与反序列化

    序列化与反序列是最常用的功能,有时我们需要将一个表单组打包成Json格式等然后再提交给服务端,这样可以提高效率节约带框,如下是Django配合Ajax实现的序列化与反序列化,文件上传等操作. Ajax ...

  3. django----orm查询优化 MTV与MVC模型 choice参数 ajax serializers

    目录 orm查询优化 only defer select_related 与 prefetch_related MTV 与 MVC 模型 choice参数 Ajax 前端代码 后端代码 前后端传输数据 ...

  4. orm查询优化 MTV和MVC模型 字段的chioces参数 Ajax

    目录 一.ORM查询优化 1. all()查询 2. only()/defer()方法 (1)only()方法 (2)defer()方法 3. select_related()/prefetch_re ...

  5. Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器-批量插入-07

    目录 models 字段补充 choices 参数/字段(用的很多) MTV与MVC模型 科普 Ajax 发送 GET.POST 请求的几种常见方式 用 Ajax 做一个小案例 准备工作 动手用 Aj ...

  6. jquery ajax 序列化表单传参提交实体对象到后台action

    ========action后台我这里使用的是SpringMVC如果用ssh用法一致=============== @Controller@RequestMapping("PubjobCon ...

  7. jquery中ajax序列化提交form表单的几种方法。

    一,ajax主流的方法 $.ajax({ type: 'post', url: 'your url', data: $("form").serialize(), success: ...

  8. ajaxfileupload原理及用法,主要用于即想用ajax序列化传递参数,又必须上传文件

    一,原理 AjaxFileUpload.js并不是一个很出名的插件,只是别人写好的放出来供大家用,原理都是创建隐藏的表单和iframe然后用JS去提交,获得返回值. 当初做了个异步上传的功能,选择它因 ...

  9. ajax序列化表单,再也不用通过data去一个个的传值了

    jQuery的serialize()方法通过序列化表单值,创建URL编码文本字符串,我们就可以选择一个或多个表单元素,也可以直接选择form将其序列化 这样,我们就可以把序列化的值传给ajax()作为 ...

随机推荐

  1. 201871010112-梁丽珍《面向对象程序设计(java)》第一周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>    https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ...

  2. 算法设计与分析 1.2 不一样的fibonacci数列

    ★题目描述 fibonacci 数列的递推公式是F(n) = F(n-1) + F(n-2)(n >= 2 且 n 为整数). 将这个递推式改为F(n) = aF(n-1) + bF(n-2)( ...

  3. AcWing 154. 滑动窗口 单调队列

    地址 https://www.acwing.com/problem/content/description/156/ 输入格式 输入包含两行. 第一行包含两个整数n和k,分别代表数组长度和滑动窗口的长 ...

  4. 第五章 与HTTP协作的Web服务器

    第五章  与HTTP协作的Web服务器 一台Web服务器可搭建多个独立域名的Web网站,也可以作为通信路径上的中转服务器提升传输效率. 1.用单台虚拟机实现多个域名 HTTP/1.1规范允许一台HTT ...

  5. c语言文件

    完整代码块展示: #include <stdio.h> #include <stdlib.h> #include <string.h> struct student ...

  6. Codeforces Round #594 (Div. 2) B. Grow The Tree 水题

    B. Grow The Tree Gardener Alexey teaches competitive programming to high school students. To congrat ...

  7. PHPer的项目RESTful API设计规范是怎样的?

    RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计. 什么是RESTful RESTful是一种软件设计风格, 主要用于客户端与服务端交互的软件. 一般来说RESTful ...

  8. webpack入门配置步骤详解

    1.初始化 1.npm install webpack webpack-cli webpack-dev-server --g 全局安装必要的第三方插件 2.mkdir config dist src ...

  9. Linq分页排序通用方法

    1.通用方法 2.调用 -----------------------------1.------------------------------------------- public class ...

  10. python 实现自定义切片类

    import numbers class Group: #支持切片操作 def __init__(self, group_name, company_name, staffs): self.group ...