(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()作为 ...
随机推荐
- 【1期】Java必知必会之一
面试官:线程池那些事儿 面试官:new 一个对象有哪两个过程?
- Less(2)
1.先判断注入类型 (1)首先看到要求,要求传一个ID参数,并且要求是数字型的:?id=1 (2)输入?id=1' and 1=1 出现错误 (3)输入 ?id=1 and 1=1 页面显示正常 (4 ...
- 关于rabbitmq
关于rabbitmq 1 简单介绍rabbitmq RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).RabbitMQ服务器是用Erlang语言编写的,而 ...
- Codechef October Challenge 2019 Division 1
Preface 这次CC难度较上两场升高了许多,后面两题都只能借着曲明姐姐和jz姐姐的仙气来做 值得一提的是原来的F大概需要大力分类讨论,结果我写了一大半题目就因为原题被ban了233 最后勉强涨了近 ...
- intellij idea从git检出代码并建立工程
1. 打开intellij idea,点击configure,settings 2. 左侧展开Version Control,点击Git,点击下图中红框中按钮 3. 在弹出窗口中找到git.exe,点 ...
- Django中的跨域请求问题
本文目录 一 同源策略 二 CORS(跨域资源共享)简介 三 CORS基本流程 四 CORS两种请求详解 五 Django项目中支持CORS 回到目录 一 同源策略 同源策略(Same origin ...
- 【Sublime Text】sublime修改默认浏览器及使用不同浏览器打开网页的快捷键设置
#第一步:安装SideBarEnhancements插件 下载插件,需要“翻墙”,故提供一下该插件的github地址:https://github.com/titoBouzout/SideBarEnh ...
- 1+X证书web前端开发中级对应课程分析
官方QQ群 1+x 证书 Web 前端开发 JavaScript 专项练习 http://blog.zh66.club/index.php/archives/198/ 1+x 证书 Web 前端开发初 ...
- SQLServer某个库log日志过大,无法收缩日志文件 ,因为该文件结尾的逻辑日志文件正在使用
问题描述: 今天看到user库日志备份方面很久,然后查看到user库这个log日志很大 图片是我已经解决了,然后现在可以收缩的大小 解决方法: 1.先备份user库日志,因为很大,所以要等很久,这个只 ...
- 【计算机网络】UDP基础知识总结
1. UDP概念相关 [!NOTE] UDP(User Datagram Protocol),又叫用户数据报协议. UDP是一个无连接的.不可靠.基于数据报的传输协议.UDP只是报文(报文可以理解为一 ...