day57

ORM查询优化

only与defer

only是拿到包含这个字段的数据对象,如果还要拿其他数据,它还会走一遍数据库
defer是拿到除了这个字段的数据对象,若要拿到这个数据,它也要走一遍数据库

select_related与prefetch_related

select_related后面跟的是一对一或者一对多外键字段,不能是多对多外键字段,它相当于联表操作,他会把表拼起来然后传回一个一个数据对象

耗时:在联表上面

prefetch_related后面跟的外键字段都可以,它相当于子查询,每添加一个外键字段就会查询一次

耗时:耗时在 一次次 查询上面

MTV与MVC模型

django自称为是MTV框架 本质其实还是MVC
MTV
M:models
T:templates
V:views
MVC
M:models
V:views
C:controllar 路由匹配

choices参数

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

...
上面这些字段可能性都是我们例举完全的

存数字 取的时候按照提前设计的好的对应关系 取出对应的真正的数据

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

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

$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
contentType:'application/json',
data:JSON.stringify({'username':'cyt','password':'123'}),
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) {

}

})

})

序列化

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)

posted @ 2019-12-01 18:43  lucky_陈  阅读(104)  评论(0)    收藏  举报