自我总结48
ORM查询优化
only与defer
only方法
返回的是一个queryset对象,本质就是列表套数据对象
该对象内只含有除了only括号内所指定的属性(其他属性也可以获取但是需要重新走数据库查询)
defer方法
only互为反关系
返回的是一个queryset对象,本质就是列表套数据对象
该对象内只含有除了defer括号内所指定的属性(其他属性也可以获取但是需要重新走数据库查询)
select_related与prefetch_related
select_related
括号内只能放外键字段 并且外键字段的类型只能一对多 或者 一对一 不能是多对多
内部是自动连表操作
会将括号内外键字段所关联的表 与当前表自动拼成一张表 然后在执行查询操作
返回的结果是一个queryset对象,本质就是列表套数据对象
该数据对象获取当前表中的数据或者关联表中的数据 都不会再走数据库(至始至终只走一次数据库)
prefetch_related
括号内支持传多个外键字段 并且没有类型限制
内部是子查询
给用户的感觉还是连表操作
返回的结果是一个queryset对象,本质就是列表套数据对象
会自动帮你按步骤查询多张表 然后将查询的结果封装到对象中
特点:每放一个外键字段 就会多走一条sql语句 多查询一张表
区别
第一个方法耗时主要耗在连表操作
第二个方法耗时主要耗在查询次数
MTV与MVC模型
django自称为是MTV框架,本质其实还是
MTV M:models
T: templates
V:views
MVC M:models
V:views
controllar
路由匹配
Vue react
choices参数
用在一些字段数据是可以明确列出所有的可能的(第一个参数不一定是数字 也可以是字符串)
1.先提前定义好对应关系
2.在通过字段的choices参数来指定关系
性别
在职状态
学历
婚否
gender_choices = (
(1,'male')
(2,'famale')
(3,'other')
)
gender = models,interferField(choices = gender_choices)
'''
该字段还是存储数字 并且范围没有限制
但是一旦存储的数据在你事先定义好的范围内,就会有查询方式
get_字段名_display()拿到对应的解释信息
'''
'''
如果存储的数字在我们提前定义好的关系中
如果存储的数字不在关系中又会怎样
能够正常存储
也能够正常取(数字)
'''
Ajax简介
异步的JavaScript和xml
1.异步提交
2.局部刷新
异步交互:不用等待后端响应,继续发送
最大优点:在不重新加载整个页面的情况下 可与服务器交换数据并更新部分页面
应用场景: GitHub注用户名实时查看用户名是否注册,不用刷新页面
XML
XML也是一门标记语言
该语法应用场景
1.写配置文件
2.可以写前端页面(odoo框架中)
每家公司都会有属于这家公司独有的内部管理软件
专门用来开发企业内部管理框架 odoo
odoo框架内部功能实现全部依赖于python2
ajax基本语法结构
# 前期准备
在使用的时候一定要先确保正常导入jQuery(JQuery封装好的方法 ,不需要掌握原生js版本)
括号内记得手动输入一个大括号
$.ajax({
...
})
# 基本语法结构
$.ajax({
url:'', // 数据提交的后端地址 不写就是往当前页面提交 也可以写后缀 也可以写全称 跟actions一样
type:'post', // 提交方式 默认是get请求
data: // 提交的数据
success:function (data) { // 形参data就是异步提交之后后端返回结果
// 回调机制需要做的事情
}
})
# 使用了ajax 三板斧都不再作用与页面 而是与data交互
前后端数据传输的编码格式
前后端交互是一个数据编码格式 针对不同的数据 后端会进行不同的处理
request.POST
requset,FILES
例子:
a标签href参数 get请求
form表单 get/post
ajax get/post
ajax发送数据的编码格式
# 编码格式 (三种)
urlencoded
form表单和ajax默认的编码方式都是urlencoded
django后端针对urlencoded会自动解析并封装成request.POST
formdata
form表单发送文件必须要指定的编码格式
该编码既可以发送文件也可以发普通的键值对
application/json
Ajax可以发送json格式的数据 form表单不支持
# 数据类型和编码格式保持一致性
form表单发送数据的编码格式
1.form表单默认的编码方式是urlencoded
urlencoded所对应的数据格式:username=jason&password=123
django后端针对urlencoded数据 会自动解析并且帮你封装到request.POST中
2.form表单发送文件 编码格式 Content-Type: multipart/form-data;针对formdata格式的数据 你在浏览器上是无法查看到
# urlencoded格式: username=jason&password=123
django后端只要你的数据满足urlencoded格式,就会自动帮你解析到request.POST中,如果你是一个文件对象django后端也会自动识别帮你放到request.FILES中
3.form表单无法发送json格式的数据 你要想发 你只能借助于ajax
Ajax传输json格式数据
# 新增一个参数
Content-Type: application/json
{"username":"jason","password":"123"}
# django后端针对json格式的数据 不会做任何处理 数据怎么来的 只会原封不动的放到request.body中,需要手动处理
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
contentType:'application/json',
data:JSON.stringify({'username':'jason','password':'123'}),
// 需要将数据序列化成json格式字符串
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, // 提交的数据
// 发送文件必须要指定的两个参数
contentType:false,
// 不指定任何编码 MyFormData对象内部自带编码 django后端能够识别
processData:false,
// 浏览器不要对数据处理
success:function (data) {// 形参data就是异步提交之后后端返回结果
// 回调机制需要做的事情
}
})
})
// django能够识别对象中的普通键值对和文件对象,然后分别放到不同的方法 POST 和 FILES
序列化
drf django restframework
from app01 import models
from django.core import serializers
# 序列化目的 将数据整合成一个大字典形式 方便数据的交互
def zzz(request):
user_queryset = models.User.objects.all()
res = serializers.serialize('json',user_queryset)
return HttpResponse(res)