Django --- 查询优化,ajax
ORM查询优化
在使用数据库数据进行查询的时候,如果每次查询数据都需要从数据库来拿数据再进行查询的话,不但会浪费时间还会加大对数据库的负荷,为此,我们对数据库的查询做一个优化,使查询的时候可以根据我们的需求来进行查询,可以提高查询的效率和减轻数据库的负荷
优化的思想:能少走一次数据库就少走一次,尽量减少数据库的操作。
only与defer查询优化
only
only查询特点:
1.使用only查询的时候返回的是一个列表套对象的行式,可以传入多个值查询
2.查询的是什么属性,返回的就是相对应属性的对象,可以直接使用对象点该属性的方式来获取该属性
3.查询该属性的时候,不管查询多少次,都是只走一次数据库
4.使用该对象查别的属性的时候,会重新去数据库中进行查找,并且查几次,就去数据库找几次,效率极低
only使用方法:


defer
defer查询特点:
1.defer查询后返回的是列表套对象的行式,可以传入多个值进行查询
2.在使用该对象对该查询属性进行查询的时候,查询一次就会走一次数据库,与only方法相反
3.在使用该对象对查询属性之后的属性进行查询的时候,不会再走数据库。
defer查询的使用方法
res = models.Book.objects.defer('book_name')
print(res)
<QuerySet [<Book: 西游记>, <Book: 三国演义>, <Book: 红楼梦>, <Book: 水浒传>, <Book: 爱迪生>]>
总结
1.only的查询与defer的查询单独使用的时候效率都很低,可以相互配合进行使用,
2.only与defer的使用方法式一样的,但是使用方式是不一致的。
select_related与prefetch_related查询优化
select_related查询
select_related查询的特点:
1.select_telated在查询的时候括号内输入的是外键,并且只能使用一对一,一对多的字段,不能使用多对多 ,会报错
2.select_related查询会将 查询的外键表与当前表拼接成一张表,将查询出来的一条条数据封装成一个个对象,使用的时候可以直接对象.属性来进行查找值
3.在查询这两个表中的数据的时候,可以直接使用对象点属性的方式将值取出来,不用再通过数据库,只会再最初的查询中走一次,之后再使用就不会再 走数据库了
4.不会对数据库进行重复操作,减轻数据库压力
5.select_related括号内可以放多个外键字段,用逗号隔开,会将多个外键字段关联的表与当前表全部拼成一张大表
select_related的使用方法:

prefetch_related查询
prefetch_related查询特点:
1.实际的查询特点是子查询,括号内写的是外键,可以写多个,也可以放多对多,按照顺序来进行查询
2.在查询的时候的特点是,会将你输入的外键都先进行查询一下,然后从中找出你需要的值
3.没放一个外键就会多对数据库进行一次操作
prefetch_related查询的使用:

select_related查询与prefetch_related查询比较
1.select_related查询时是现在数据库中将表连接在一起,浪费的是连表的时间,之后查询的时间会很快
2.prefetch_related查询是一个一个表进行查询,浪费的是查询的时间,
总结:在使用的时候可以根据实际情况来进行使用,
MTV与MVC模型
MTV模型:models,templates,views三层。models负责业务对象与数据库的映射,views负责与用户的交互,templates存放需要使用的模板
MVC模型:把web应用中的models,controller,views三层按照某种方式连接在一起,models负责业务对象与数据库的映射,views负责与用户的交互,controller接收用户的输入调用模型和视图完成用户的请求
choices参数
choices参数的作用:
在数据库中输入某一个值的时候,可以查询到其相对应的信息,就类似于我们先将每个信息与他所对应的简单的信息存好,在使用的时候通过简单的信息来查找到对应的信息。
choices使用的时候的注意点:
1.在定义choices参数的时候使用元组,括号内是两者对应的值
2.定义好choices参数之后再定义相对应的字段名
3.在调用的时候是通过这条数据的对象.get_字段名_display() 的行式来获取相对应的值
4.choices中只有1,2的时候,我添加了3,查询1,2的时候会返回相对应的信息,查询3的时候不会报错,也不会返回正确的值,会将3返回
使用方法
1.在创建的类中,先定义好需要使用的choices参数,再定义字段名
class Ceshi(models.Model):
gender_choice = {
(1,'男'),
(2,'女')
}
gender = models.IntegerField(choices=gender_choice)
2.在使用的时候需要使用句式
ceshi_obj = models.Ceshi.objects.get(pk=3) # pk=3为查找条件
print(ceshi_obj.get_gender_display()) # get_字段名_display()
ajax简介
什么是ajax
ajax是异步的js和XML,使用js语言与服务器进行异步交互,传输数据为XML(不只是XML),ajax不是新的编程语言,他是使用js语言来进行操作的。简单的说就是前后端进行交互的一种方式,这种交互方式可以在不刷新页面的情况下使用
ajax如何使用
1.创建一个html文件,导入jquery框架
2.在script中进行添加,配置好必要的信息
3.将需要处理的数据在views中进行处理,使用Httpresponse进行返回
# 具体实例
# html中
<script>
$('#d4').on('click',function(){
$.ajax({
url:'', # 提交地址,与form中一样的性质
type:'post', # 请求方式,默认是get
data:{'i1':$('#d1').val(),'i2':$('#d2').val()}, # 发送的数据,按照字典的行式传输
success:function(data){ # 接收返回值并进行操作,data是异步提交之后的结果
$('#d3').val(data) # 回调机制需要做的事情
} }) })
</script>
ajax有什么优点
ajax最大的优点就是不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容,ajax不需要任何浏览器插件,但是需要用户允许js在浏览器上执行
注意:如果使用了ajax,在使用render,Httpresponse,redirect作用的对象是data,不再是整个页面
前后端传输数据编码格式
前端与后端进行交互的时候需要统一一种编码,不然前端与后端的编码不一致,造成无法识别,前后端就不能进行交互了。
前后端进行交互的编码格式:
1.urlencoded
2.formdata
3.application/json
form表单发送数据的编码格式:
1.form表单默认的编码方式是urlencoded
urlencoded所对应的数据格式是:username : ' wang '
2.form表单发送文件所对应的编码格式是:form-data
form-data锁对应的数据格式是没有办法看到的,django后端自动做了处理
当发送到后端的数据中既有文件,键值对的时候,django会自动进行分类,键值对行式的对象会使用request.POST进行接收,而文件则使用request.FILES进行接收
3.form表单无法发送json格式的数据,只能借助于ajax
所以,form只能发送两种编码格式,不能发送json格式的数据,默认发送的是urlencoded编码格式,而使用文件的时候发送的是form-data编码格式
ajax发送数据的编码格式:
1.在默认的情况下默认的编码方式是:urlencoded
2.在发送json数据的时候对应的编码格式是:application/json
3.在发送文件的时候对应的编码格式是: form-data
ajax如何传输json格式数据
# html中
<button type="submit" id="d4">点击</button>
<script>
$('#d4').click(function (e) {
$.ajax({
url:'',
type:'post',
contentType:'application/json', # 传输文件的时候必须的参数
data:JSON.stringify({'username':'wang'}), # 先转成json串格式
success:function (data) {
alert(123)
}
})
})
</script>
# views中
def ajax_ceshi(request):
print(request.is_ajax())
print(request.POST)
if request.is_ajax():
json_bytes = request.body
json_dic = json.loads(json_bytes) # 自动帮你解码加反序列化
return HttpResponse()
return render(request,'ajax_ceshi.html')
# json文件的编码格式:Content-Type: application/json
# 输出结果 {"username":"wang"}
ajax如何传入文件数据
传输文件数据的流程:
1.先使用new生成一个内置对象
2.然后将自定义的对象发送到后端
# 传输文件
# html中
<script>
$('#d4').click(function(){
var MyForm = new FormData();
MyForm.append('username','wang');
MyForm.append('password',123);
MyForm.append('myfile',$('#d1')[0].files[0]);# 获取文本框中的文件
$.ajax({
url:'',
type:'post',
data:MyForm, # 将自定义的对象发送到后端
contentType:false, # 不使用任何编码
processData:false, # 不要处理数据
success:function(data){
alert(123)
}
})
})
</script>
def ajax_ceshi(request):
print(request.is_ajax())
print(request.POST) # 检测发送过来的数据
print(request.FILES) # 检测传输的文件
if request.is_ajax():
return HttpResponse()
return render(request,'ajax_ceshi.html')
序列化
后端向前端返回的数据格式进行序列化,为了能够支持前后端分离,将数据整合成一个大字典的行是,方便数据的交互。
def ser(request):
#拿到用户表里面的所有的用户对象
user_list=models.User.objects.all()
#导入内置序列化模块
from django.core import serializers
#调用该模块下的方法,第一个参数是你想以什么样的方式序列化你的数据
ret=serializers.serialize('json',user_list)
return HttpResponse(ret)
Django --- 查询优化,ajax的更多相关文章
- python Django之Ajax
python Django之Ajax AJAX,Asynchronous JavaScript and XML (异步的JavaScript和XML),一种创建交互式网页应用的网页开发技术方案. 异步 ...
- django 接受 ajax 传来的数组对象
django 接受 ajax 传来的数组对象 发送:ajax 通过 POST 方式传来一个数组 接收:django 接受方式 array = request.POST.getlist(‘key[]’) ...
- python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)
昨日内容回顾 基于对象的跨表查询 正向查询:关联属性在A表中,所以A对象找关联B表数据,正向查询 反向查询:关联属性在A表中,所以B对象找A对象,反向查询 一对多: 按字段:xx book ----- ...
- Django使用AJAX调用自己写的API接口
Django使用AJAX调用自己写的API接口 *** 具体代码和数据已上传到github https://github.com/PythonerKK/eleme-api-by-django-rest ...
- Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件
一.Django与Ajax AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻 ...
- Django之Ajax提交
Ajax 提交数据,页面不刷新 Ajax要引入jQuery Django之Ajax提交 Js实现页面的跳转: location.href = "/url/" $ajax({ url ...
- Django框架第九篇--Django和Ajax、序列化组件(serializers)、自定义分页器、模型表choice参数
Django和Ajax 一.什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”.即使用Javascript语 ...
- Django之AJAX传输JSON数据
目录 Django之AJAX传输JSON数据 AJAX 中 JSON 数据传输: django响应JSON类型数据: django 响应 JSON 类型数据: Django之AJAX传输JSON数据 ...
- Django之ajax(jquery)封装(包含 将 csrftoken 写入请求头方法)
由于支持问题,未使用 es6 语法 _ajax.js /** * 发起请求 * @param url 请求地址 * @param data 请求数据 { } json格式 * @param type ...
随机推荐
- [转帖]中信银行信用卡业务数据库实现国产替换,湖北银行新核心系统项目正式验收,阿里云与MongoDB达成战略合作
中信银行信用卡业务数据库实现国产替换,湖北银行新核心系统项目正式验收,阿里云与MongoDB达成战略合作 http://www.itpub.net/2019/10/31/3942/ 中信银行 gold ...
- Linux学习-防火墙-Selinux-配置本地YUM源
关闭防火墙并设置开机不启动 systemctl status firewalld.service #查看firewalld状态systemctl stop firewalld #关闭systemctl ...
- win10无法安装软件解决
https://www.windowscentral.com/how-fix-network-resource-unavailable-install-error-windows-10
- python 之 Django框架(服务器程序和应用程序、基础必备三件套及相关配置)
第十二章 Django框架 12.1 服务器程序和应用程序 服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理.应用程序则负责具体的逻辑处理.为了方便应用程序的开发, ...
- 【LeetCode】 #9:回文数 C语言
目录 题目 思路 初步想法 进一步想法 最后想法 总结 最近打算练习写代码的能力,所以从简单题开始做. 大部分还是用C语言来解决. @(解法) 题目 判断一个整数是否是回文数.回文数是指正序(从左向右 ...
- struct,interface,method
struct类型,值传递的 声明 struct { name string age int } //几种声明使用方式: var P person // P现在就是person类型的变量了 P.name ...
- 协议——SPI
SPI(Serial Peripheral interface)是由摩托罗拉公司定义的一种串行外围设备接口,是一种高速.全双工.同步的通信总线,只需要四根信号线即可,节约引脚,同时有利于PCB的布局. ...
- 怎么理解js的原型链继承?
前言 了解java等面向对象语言的童鞋应该知道.面向对象的三大特性就是:封装,继承,多态. 今天,我们就来聊一聊继承.但是,注意,我们现在说的是js的继承. 在js的es6语法出来之前,我们想实现js ...
- (五) Docker 安装 Nginx
参考并感谢 官方文档 https://hub.docker.com/_/nginx 下载nginx镜像(不带tag标签则表示下载latest版本) docker pull nginx 启动 nginx ...
- NIO开发Http服务器(4):Response封装和响应
最近学习了Java NIO技术,觉得不能再去写一些Hello World的学习demo了,而且也不想再像学习IO时那样编写一个控制台(或者带界面)聊天室.我们是做WEB开发的,整天围着tomcat.n ...