(day55)七、查询优化、MTV和MCV、choices、AJAX、序列化
一、ORM查询优化
(一)only与defer
(1)only
- 括号内放字段,返回包含着一个个数据对象的queryset对象,数据对象中只含有该字段值
- 也可以查询其他字段,但是数据来源是重新去数据库中查找,效率极低
res = models.Book.objects.only('title')
(2)defer
- defer查询出来的对象包含除了该字段以外的其他字段值
- 也可以查询其他字段,但是数据来源是重新去数据库中查找获取该字段值
res = models.Book.objects.defer('title')
(二)select_related与prefatch_related
(1)select_related
- 括号内只能放外键字段,外键类型只能是一对一、一对多,不能是多对多
- 查询出来的是原表和外键关联的表,因此查询外键关联的表时不需要再去数据库访问
- 当表数据很多时,比较耗时
res = models.Book.objects.select_related('publish')
for i in res:
# print(i.title)
print(i.publish)
(2)prefatch_related
- 括号内只能放外键字段(可以放多个),会按步骤查询多张表,相当于子查询
- 访问数据库次数多,每多放一个外键字段,就会多访问一次数据库
res = models.Book.objects.prefetch_related('publish','authors')
for i in res:
# print(i.title)
print(i.publish)
二、MTV与MVC模型
- django自称为是MTV框架,其实本质是MVC
- MTV:把web应用分为模型(Model)、模板(Template)、视图(View)三层, 他们之间以一种插件似的,松耦合的方式连接在一起。
- Model(模型):负责业务对象与数据库的对象(ORM)
- Template(模版):负责如何把页面展示给用户
- View(视图):负责业务逻辑,并在适当的时候调用Model和Template
- MVC:把web应用分为模型(Model)、控制器(Control)、视图(View)三层, 他们之间以一种插件似的,松耦合的方式连接在一起。
- 模型负责业务对象与数据库的对象(ORM)
- 视图负责与用户的交互(页面)
- 控制器(C)接受用户的输入调用模型和视图完成用户的请求。
三、choices参数
.get_字段名_display:获取数字对应的值得统一句式,否则只能获得数字- 没有对应关系,获取的也还是数字
# models.py
class User(models.Model):
username = models.CharField(max_length=64)
password = models.IntegerField()
gender_choices = (
(1,'男'),
(2,'女'),
(3,'其他'),
)
gender = models.IntegerField(choices=gender_choices)
# test.py
user_obj = models.User.objects.get(pk=1)
user_obj1 = models.User.objects.get(pk=4)
print(user_obj.gender) # 1
print(user_obj1.gender) # 4
print(user_obj.get_gender_display()) # 男
print(user_obj1.get_gender_display()) # 4
四、AJAX
(一)JSON和XML
(1)什么是Json
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言 *
- JSON 具有自我描述性,更易理解
JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
(2)JSON的用法
- JavaScript
- 序列化:JSON.stringify()
- 反序列化:JSON.parse()
- Python
- 序列化:json.dumps()
- 反序列化:json.loads()
(3)XML
- XML也是一门标记语言,可应用于写配置文件和前端页面(odoo框架,用于开发企业内部管理软件,依赖于python2)
- JSON 格式于2001年由 Douglas Crockford 提出,目的就是取代繁琐笨重的 XML 格式
(二)什么是AJAX
- AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)
- 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
- 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求,比如注册时用户名查重
- AJAX 不是新的编程语言,而是一种使用现有标准的新方法 ,不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行
- 优点: 在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容(异步交互)
(三)jQuery实现AJAX
- $.ajax({}):开启AJAX的语法句式
- url:数据提交的后端地址,不写就是往当前页面提交,和actions的作用一样
- type:请求的方式,默认get请求
- data:提交给后端数据,此时HttpResponse对象返回的不是页面,而是与data交互
- success:function(data){}:固定写法,参数data为后端返回的数据
- is_ajax():是否是ajax请求,返回布尔值
<!--xxx.html-->
<script>
$('#d4').on('click',function () {
// 开启ajax语法
$.ajax({
url:'', // 数据提交的后端地址 不写就是往当前页面提交 也可以写后缀 也可以写全称 跟actions一样
type:'post', // 提交方式 默认是get请求
data:{'i1':$('#d1').val(),'i2':$('#d2').val()}, // 提交的数据
success:function (data) { // 形参data就是异步提交之后后端返回结果
$('#d3').val(data) // 回调机制需要做的事情#
alert(data)
}
})
})
</script>
# views.py
def xxx(request):
# print(request.is_ajax()) # 判断当前请求是否是ajax请求
# print(request.POST) # ajax发送的post请求 普通的键值对也在request.POST中获取
if request.is_ajax():
# i1 = request.POST.get('i1')
# i2 = request.POST.get('i2')
# res = int(i1) + int(i2)
# return HttpResponse(res) # 给异步回调函数 success
# return render(request,'xxx.html') # 给异步回调函数 success
return redirect('https://www.baidu.com') # 给异步回调函数 success
return render(request,'xxx.html')
(四)前后端传输数据编码格式
(1)urlencoded格式
- 对应的数据格式为
username=wick&password=123,django后端会自动解析并封装到request.POST中 - ajax和form表单中默认的编码格式
(2)formdata格式
- 用于发送文件,该格式的数据浏览器上无法查看,django后会自动识别并封装到request.FILES中
- ajax和form表单都可以发送
(3)application/json格式
form表单无法发送该格式数据,只能通过ajax
(五)Ajax传输json格式数据和文件数据
(1)传输json格式数据
- django后端不会对json格式的数据进行处理,需要手动序列化与反序列化,
contentType:'application/json',:设置数据类型格式data:JSON.stringify({'username':'jason','password':'123'}),:序列化数据
<script>
// 传json格式的数据
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
contentType:'application/json',
data:JSON.stringify({'username':'jason','password':'123'}),
success:function (data) {
alert(123)
}
})
</script>
(2)传输文件数据
- 生成内置对象:
var MyFormData = new FormData();,该对象可以传输文件数据,也支持普通键值对 - append:添加普通键值或者文件数据
$('#d1')[0].files[0]:input框中文件对象contentType:false,:MyFormData对象内部自带编码 django后端能够识别processData:false,:不需要处理数据
<script>
// 传文件
$('#d1').click(function () {
// 先生成一个内置对象
var MyFormData = new FormData();
// 1. 先添加普通的键值
MyFormData.append('username','jason'); // 添加了一组普通的简直对
MyFormData.append('password','123');
MyFormData.append('hobby',['read','run']);
// 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) {
}
})
})
</script>
(六)序列化(serializers)
- 可以把orm查询出来的数据对象中的所有字段值自动整合成一个字典发送给客户端,方便数据交互
- 字典包括表名、主键值、封装了字段对应值的字典
def ser(request):
# 1. 拿到用户表里面的所有的用户对象
user_list=models.User.objects.all()
# 2. 导入内置序列化模块
from django.core import serializers
# 3. 调用该模块下的方法,第一个参数是你想以什么样的方式序列化你的数据
ret=serializers.serialize('json',user_list)
return HttpResponse(ret)
(day55)七、查询优化、MTV和MCV、choices、AJAX、序列化的更多相关文章
- django基础之FBV与CBV,ajax序列化补充,Form表单
目录: FBV与CBV ajax序列化补充 Form表单(一) 一.FBV与CBV 1.什么是FBV.CBV? django书写view时,支持两种格式写法,FBV(function bases vi ...
- Django Ajax序列化与反序列化
序列化与反序列是最常用的功能,有时我们需要将一个表单组打包成Json格式等然后再提交给服务端,这样可以提高效率节约带框,如下是Django配合Ajax实现的序列化与反序列化,文件上传等操作. Ajax ...
- django----orm查询优化 MTV与MVC模型 choice参数 ajax serializers
目录 orm查询优化 only defer select_related 与 prefetch_related MTV 与 MVC 模型 choice参数 Ajax 前端代码 后端代码 前后端传输数据 ...
- orm查询优化 MTV和MVC模型 字段的chioces参数 Ajax
目录 一.ORM查询优化 1. all()查询 2. only()/defer()方法 (1)only()方法 (2)defer()方法 3. select_related()/prefetch_re ...
- Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器-批量插入-07
目录 models 字段补充 choices 参数/字段(用的很多) MTV与MVC模型 科普 Ajax 发送 GET.POST 请求的几种常见方式 用 Ajax 做一个小案例 准备工作 动手用 Aj ...
- jquery ajax 序列化表单传参提交实体对象到后台action
========action后台我这里使用的是SpringMVC如果用ssh用法一致=============== @Controller@RequestMapping("PubjobCon ...
- jquery中ajax序列化提交form表单的几种方法。
一,ajax主流的方法 $.ajax({ type: 'post', url: 'your url', data: $("form").serialize(), success: ...
- ajaxfileupload原理及用法,主要用于即想用ajax序列化传递参数,又必须上传文件
一,原理 AjaxFileUpload.js并不是一个很出名的插件,只是别人写好的放出来供大家用,原理都是创建隐藏的表单和iframe然后用JS去提交,获得返回值. 当初做了个异步上传的功能,选择它因 ...
- ajax序列化表单,再也不用通过data去一个个的传值了
jQuery的serialize()方法通过序列化表单值,创建URL编码文本字符串,我们就可以选择一个或多个表单元素,也可以直接选择form将其序列化 这样,我们就可以把序列化的值传给ajax()作为 ...
随机推荐
- arp心得-caidachun
arp地址解析协议,以前也学习过,一直有疑问,不同网段怎么解析,arp代理是什么,静态路由为什么可以配置下一跳是接口,而不是ip 1.同网段广播请求,单播应答 2.不同网络根据路由表的下一跳地址ip地 ...
- 201871010116-祁英红《面向对象程序设计(java)》第十五周学习总结
博文正文开头格式:(2分) 项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://ww ...
- HTML网页自动跳转(重定向)
HTML网页自动跳转(重定向) meta <head> <meta http-equiv="refresh" content="5;url=https: ...
- WPF 快捷键
原文:WPF 快捷键 <p><pre name="code" class="csharp"> 前台 <Window.Resourc ...
- 第二章 简单的HTTP协议
第二章 简单的HTTP协议 针对HTTP协议结构进行讲解 1.通过请求和响应的交换来达成通信目的 应用HTTP协议时,必定是一端担任客户端角色,另一端担任服务器端角色. [请求报文]是由请求方法.UR ...
- Vue 监听鼠标左键 鼠标右键以及鼠标中键修饰符click.left&contextmenu&click.middle
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Centos7升级gcc极简教程
centos7默认gcc版本为4.8,一般不满足编译需求,因此升级gcc版本为常见操作: 现有博客中,大多数教程都是基于源码重新编译安装:但是源码编译过程等待时间很长且编译麻烦. 因此,直接基于命令升 ...
- gradle中gredle -q 参数是什么意思
很多地方在调用 gradle 命令时都加了 -q 参数.该参数用来控制 gradle 的日志级别,可以保证只输出我们需要的内容.
- 趣谈Linux操作系统学习笔记:第二十四讲
一.小内存的分配基础 1.kmem_cache_alloc_node的作用 通过这段代码可以看出,它调用了kmem_cache_alloc_node函数,在task_struct的缓存区域task_s ...
- Feign、httpclient、OkHttp3 结合使用
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 疯狂创客圈 正在进行分布式和高并发基础原理 的研习,比如下面的一些基础性的内容: 一.Netty Redis 亿级流量 ...