day 55小结

ORM查询优化

only与defer

​ only括号内放字段 查询结果是一个列表套一个个的数据对象 这些数据对象点括号内的字段属性不会再查询数据库 直接就是对象获取属性 也支持点击括号内内有的字段 但是每次点击就会重新走一次数据库

​ defer与only是互为反操作
​ defer括号内放什么字段 查询出来的对象就没有该字段属性 如果你要点击 每点击一次就要重新走一次数据 而你点击了非括号内的字段 就不会走数据库 仅仅是对象属性的操作

​ select_related括号内只能放外键字段 并且外键字段的数据类型只能是一对多 或者 一对一 不能是多对多

​ 内部是自动连表操作 会将括号内外键字段所关联的表 与当前表自动拼接成一张表 然后将表中的数据一个个查询出来封装成一个个的对象

​ 这样做的好处就是跨表不需要重新走数据库了 减轻了数据库的压力

​ select_related括号内可以放多个外键字段 逗号隔开 会将多个外键字段关联的表与当前表全部拼成一张

​ perfetch_related内部是子查询

​ 会自动帮你按步骤查询多张表 然后将查询的结果封装到对象中

​ 给用户的感觉好像还是联表操作

​ 括号内支持传多个外键字段 并且没有类型限制
​ 特点: 每放一个外键字段 就会多走一条sql语句 多查询一张表

​ 耗时: 查询次数

choices参数

​ 用户表
​ 性别
​ 在职状态
​ 学历
​ 婚否
​ ...

​ 上面这些字段可能性都是我们列举完全的
​ 存数字 取的时候按照提前

第一个参数不一定是数字也可以是字符串

只要你是

MTV与MVC模型

​ django自称为MTV框架 本质其实还是MVC

​ MTV
​ M: models
​ T: templates
​ V: views

​ MVC
​ M: models
​ V: views
​ C: controllar 路由匹配

Ajax简介

​ XML也是一门标记语言
​ 该语法应用场景:
​ 1.写配置文件
​ 2.可以写前端页面(odoo框架中 erp)
​ 每家公司都会有属于这家公司独有的内部管理软件
​ 专门用来开发企业内部管理软件 框架 odoo
​ odoo框架内部功能实现全部依赖于python2
​ 薪资计算

​ AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

​ 需求:

​ 页面上有三个input框
​ 前两个数数字 最后一个展示两者的和
​ 要求是页面不刷新

​ 我们在学的时候只学JQuery封装好的方法 不需要掌握原生js版本
​ 在使用的时候一定要先导入jQuery
​ 括号内记得手动输入一个大括号

$.ajax({

})

ajax基本语法结构

$.ajax({
    url:'',  // 数据提交的后端地址  不写就是往当前页面提交  也可以写后缀 也可以写全称  跟actions一样
    type:'post',  // 提交方式  默认是get请求
    data:{'i1':$('#d1').val(),'i2':$('#d2').val()},  // 提交的数据
    success:function (data) {  // 形参data就是异步提交之后后端返回结果
                             $('#d3').val(data)  // 回调机制需要做的事情
                            }
})  # 一旦你使用了ajax 必知必会三板斧都不再作用与页面 而是与data交互

a标签href参数 get请求
form表单 get/post
ajax get/post

get请求数据格式

url?xxx=ooo&zzz=yyy

前后端传输数据

​ 前后端传输数据编码格式:

​ 前后端交互是一个数据编码格式 针对不同的数据 后端会进行不同的处理

request.POST
request.FILES

你只需要知道三种即可

1.urlencoded
2.formdata
3.application/json

form表单发送数据的编码格式

Content-Type: application/x-www-form-urlencoded
1.form表单默认的编码方式是urlencoded
urlencoded所对应的数据格式
username=jason&password=123
django后端针对urlencoded数据 会自动解析并且帮你封装到request.POST中

2.form表单发送文件 编码格式 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryhjKCHQHDmcE62iMQ
针对formdata格式的数据 你在浏览器上是无法查看到

​ django后端只要你的数据满足urlencoded格式
​ username=jason&password=123
​ 就会自动帮你解析到request.POST中
​ 如果你是一个文件对象django后端也会自动识别帮你放到request.FILES中

3.form表单无法发送json格式的数据 你要想法 你只能借助于ajax

ajax发送数据的编码格式

ajax能够发送三种格式数据
1.urlencoded
2.formdata
3.application/json

Content-Type: application/x-www-form-urlencoded; charset=UTF-8
ajax默认的编码格式也是urlencoded 也就意味着后端django也是将数据解析到request.POST中

​ 在涉及到前后端交互的时候 你一定要做到数据的格式与编码格式一致

​ 数据是一种格式 请求头里面是另外一种格式

Ajax如何传输json格式数据

dumps stringify

loads parse

Content-Type: application/json
{"username":"jason","password":"123"}

django后端针对json格式的数据 不会做任何处理 数据怎么来的 只会原封不动的放到request.body中
需要你自己手动处理

$('#d1').click(function () {
    $.ajax({
        url:'',
        type:'post',
        contentType:'application/json',  # 1.注意点1
        data:JSON.stringify({'username':'jason','password':'123'}),  # 2.注意点2
        success:function (data) {
            alert(123)
        }
    })
})

Ajax如何传输文件数据(*********)

借助于内置对象 new
该对象即可以携带文件数据 同样也支持普通的键值对

 $('#d1').click(function () {
     // 先生成一个内置对象
     var MyFormData = new FormData();
     // 1. 先添加普通的键值
     MyFormData.append('username','jason');  // 添加了一组普通的简直对
     MyFormData.append('password','123');
     // 2. 添加文件数据
     MyFormData.append('myfile',$('#d2')[0].files[0]);  // 如何获取input框中文件对象$('#d1')[0].files[0]
     $.ajax({
         url:'',
         type:'post',
         data:MyFormData,  # 1

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

         success:function (data) {

         }

     })
 })

序列化

django内置模块serializers

drf  django restframework 
from app01 import models
from django.core import serializers
# 序列化目的  将数据整合成一个大字典形式 方便数据的交互
def zzz(request):
    user_queryset = models.User.objects.all()
    # [{username:...,password:...,hobby:...,},{},{},{}]
    # user_list = []
    # for data in user_queryset:
    #     user_list.append(
    #         {'username':data.username,
    #          'password':data.password,
    #          'gender':data.get_gender_display(),
    #
    #          }
    #     )
    res = serializers.serialize('json',user_queryset)
    return HttpResponse(res)

猜你喜欢

转载自www.cnblogs.com/LZF-190903/p/11968488.html