(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()作为 ...
随机推荐
- The 2017 ACM-ICPC Asia Beijing Regional Contest
传送门 C - Graph 题意: 给出一个\(n\)个点\(m\)条边的无向图.现在有多组询问,每组询问给出区间\([l,r]\),问区间\([l,r]\)中有多少点对是连通的. 思路: 若考虑只有 ...
- python 1 默写用递归实现无限极分类 2 默写用树实现无限极分类
data=[ {"cat_id":3,"name":"沙河","parent_id":1}, {"cat_id ...
- mysql导出数据的几种形式-待更新
1.导出某个数据库的某张表,添加where条件 mysqldump -u [用户名] -p -h [ip地址] --default-character-set=utf8 [数据库名] [表名] - ...
- C语言中,字符型数字与常数型数字的加减实现
char in-str[10],out-str[10]; for(int i=0;i<10;i++) { out-str[i]=9-(in-str[i]-'0')+'0'; }
- CF1248F Catowice City
题目链接 problem 有\(n\)个人,每个人家有一只猫.每个人都认识一些猫(其中肯定包括自己家的猫).选出\(j\)个人和\(k\)只猫\((j,k\ge 1)\).使得\(j+k=n\)且选出 ...
- 从游击队到正规军(二):马蜂窝旅游网的IM客户端架构演进和实践总结
一.引言 移动互联网技术改变了旅游的世界,这个领域过去沉重的信息分销成本被大大降低.用户与服务供应商之间.用户与用户之间的沟通路径逐渐打通,沟通的场景也在不断扩展.这促使所有的移动应用开发者都要从用户 ...
- hbase数据加盐(Salting)存储与协处理器查询数据的方法
转自: https://blog.csdn.net/finad01/article/details/45952781 ----------------------------------------- ...
- 【51Nod1769】Clarke and math2(数论,组合数学)
[51Nod1769]Clarke and math2(数论,组合数学) 题面 51Nod 题解 考虑枚举一个\(i_k\),枚举一个\(i\),怎么计算\(i_k\)对\(i\)的贡献. 把\(\f ...
- 数据库——SQL-SERVER练习(5) 供应关系
以下题目用到工程供应数据库关系模式:供应商(供应商号,供应商名,城市) S(Sno,Sname,City)零件(零件号,零件名,零件颜色) P(Pno,Pname,Color)工 ...
- CCF模拟试题——最大的矩形 Java
我们先看一下题目: 问题描述 试题编号: 201312-3 试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻 ...