目录
ORM查询优化
only与defer
only括号内放字段 查询结果是一个列表套一个个的数据对象 这些数据对象点括号内的字段属性不会再查询数据库 直接就是对象获取属性 也支持点击括号内内有的字段 但是每次点击就会重新走一次数据库
defer与only是互为反操作
defer括号内放什么字段 查询出来的对象就没有该字段属性 如果你要点击 每点击一次就要重新走一次数据 而你点击了非括号内的字段 就不会走数据库 仅仅是对象属性的操作
select_related与prefetch_related
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)