orm查询优化

onlydefer(推迟)

djangoorm是惰性查询 目的:减少不必要的数据库操作 降低数据库压力(能少走一次数据库就少走数据库)

only

  1. # 案例
  2. res = models.Book.object.values('title') # 拿到的是列表套字典
  3. for i in res:
  4. print(res.title) # 不能够点取值
  5. res = models.Book.object.only('title') # 括号内放字段 :[数据对象,]
  6. for i in res:
  7. print(res.title) # 使用点方法 不会走数据库 直接就是对象获取属性
  8. print(res.pirce) # 也可以点括号内没有包含的字段 也可以 但是每查询一次就走一次数据库 效率极低

defer

  1. # 案例
  2. res = models.Book.object.defer('title') # 括号内放字段 :[数据对象,]
  3. for i in res:
  4. print(res.title) # 括号内放的字段 查询出来的就没有该字段 如果点了就会走数据库
  5. print(res.price) # 使用点方法 不会走数据库 直接就是对象获取属性

总结:defer和only互为相反关系

select_related 与 prefetch_related

select_related(有关系的)与prefetch_related(预先载入)

select_related括号内只能放外键字段并且只能是一对多 或者 一对一不能是 多对多

  1. # 案例
  2. res = models.Book.object.select_related('publish')
  3. for i in res:
  4. print(res.publish)
  5. # 可以放多个外键字段 会将多个外键字段关联的表与当前表拼成一张大表 用逗号隔开

总结:内部是自动连表操作 会将括号内外键字段所关联的表 与 当前的表自动拼接成一张 然后 将表中的数据一个个查询出来封装成一个个对象

prefetch_related内部是一个子查询(会自动帮你按步骤查询多张表, 然后将查询的结果封装到对象中, 给用户的感觉还是连表操作)

  1. # 案例
  2. res = models.Book.ojbect.prefetch_related('publish', 'author__title')
  3. for i in res:
  4. print(i.publish)
  5. # 特点:每添加一个外键字段就会多走一条sql语句 支持多对多

总结:select_related 耗时: 连表操作

​ prefetch_related 耗时: 查询的次数长

两者之间的优缺点:结合实际情况

MTV 与 MVC 模型

​ 纯理论:django自称为是MTV框架 本质还是MVC

​ MTV : models templates views

​ MVC : models views controller(路由匹配) 控制器

​ Vue : Mvvm

choice参数

​ 例子: 用户表的 性别 在职状态 学历 婚否 这几个字段都是有一个明确范围的

​ 我们可以提前给他一个对应关系 按照提前设计好的对应关系取出对应的真正数据

  1. # 以性别为例
  2. class User(models.Model):
  3. username = models.CharField(max_length=255)
  4. gender_choices = (
  5. (1,'男'),
  6. (2,'女'),
  7. (3,'其他'),
  8. )
  9. gender = models.IntegerField(choices=gender_choices) # 该字段存的是数字
  10. # 验证: 如果存储的数字在我们提前定义好的关系中会怎么样
  11. 1 能够正常存储 2 也能够正常获取 获取的数字
  12. # 如果不在会怎么样
  1. (*******) 只要是choice字段类型 在获取值的时候统一句式 get_字段名_display
  2. res = models.User.object.get(pk=1)
  3. print(res.get_gender_display()) (******)
  4. # 如果拿没有对应关系的 获取到的还是数据本身

Ajax

​ (异步的JavaScript和xml xml也是一门标记语言 也可以写前端页面 (odoo框架 erp))

​ ajax最大的特点 : 不从新加载页面的情况下, 可以与服务器交互数据并更新(不知不觉完成请求和响应)

​ 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;

  1. 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

前端代码

  1. $('#b1').click(function () {
  2. $.ajax({
  3. url:'', // 指定url
  4. type:'POST', // 指定提交方式 默认是get方式
  5. data:{i1:$('#i1').val(),i2:$('#i2').val()}, // 提交数据
  6. success:function (data) { // data就是异步提交之后后端返回的结果
  7. $('#i3').val(data) // 响应成功后执行的函数
  8. }
  9. })
  10. })

后端代码

  1. def ajax(request):
  2. print(request.is_ajax()) # 判断当前请求是否是ajax请求
  3. print(resqust.POST) # ajax发送的post请求 普通的键值对也是在request.POST中
  4. return JsonResponse('哈哈哈')
  5. return HttpResponse('哈哈') # 会给异步回调函数的data
  6. return render(request, 'http.html') # 不会给浏览器 只会给回调函数的data
  7. return redirect('/home/') # 所有的三剑客都不会作用于页面 而是和data交互

前后端传输数据编码格式

​ 前后端交互的时候有一个数据编码格式, 针对不同的数据 后端会进行不同的处理

request.POST request.FILES 我们学过的获取数据方式

​ (*****)编码格式 有 三种 1.urlencoded 2. formdata 传的是文件 3. application/json

  1. 能够向后端发送数据的方式
  2. a 标签的href参数 get请求
  3. form 表单 get/post
  4. 请求头中(提前携带一些数据 让后端知道 kv键值对)
  5. Content-Type: urlencode 默认
  6. 数据在 form-data 里面 对应的数据格式是 user=xxx&user=xxx
  7. django后端针对urlencoded数据 会自动解析并且帮你封装到request.post
  8. ajax 提交 get/post

from表单传文件

​ 指定type=file 编码格式指定为formdata 针对formdata格式的数据 你在浏览器中是看不到的

​ 指定 enctype = formdata 即可拿到post 也可以拿到file 但是不指定 拿到的文件仅仅只是一个文件名字

​ 后端获取: request.FILES 拿到文件对象

form表达无法发送json格式的数据 如果想法只能借助于ajax(****)

ajax指定编码格式

传json

  1. // ajax 默认是 urlencode编码格式
  2. // ajax 能够发送 上面三种的格式数据
  3. // ajax 传输json格式数据(******)
  4. $('#d1').click(function(){
  5. $.ajax({
  6. url:'',
  7. type:'post',
  8. contentType:'', // 不写默认是 urlencoded
  9. contentType:'application/json' // 指定json格式
  10. data:JOSN.stringify({'user':'龙哥'}), // 转换json数据
  11. success:function(data){
  12. window.console.log('data')
  13. }
  14. })
  15. })

后端获取json

  1. # 后端如何拿到json格式的数据
  2. # django后端针对json格式的数据 不会做任何处理 数据怎么来的 只会原封不动的放到request.body中(******) 需要手动处理 是个二进制
  3. json_bytes = request.body
  4. json_str = json_bytes.decode('utf-8') or str(json_bytes, encode('utf-8'))
  5. import json
  6. json_dic = json.loads(json_str)
  7. # 其实json可以直接帮你解码和反序列化

传文件

  1. // ajax 传输 文件格式数据(******)
  2. // 需要借助于一个内置对象 new 该对象既可以携带文件数据 也 支持 普通的键值对
  3. $('#d1').click(function(){
  4. // 生成一个内置对象
  5. var MyFormData = new FormData()
  6. // 1. 先添加普通建值
  7. MyFormData.append('username','LOGN')
  8. MyFormData.append('PASSWORD','123')
  9. // 2. 添加文件数据
  10. MyFormData.append('myfile',$('#d1')[0].files[0]) // ******
  11. $.ajax({
  12. url:'',
  13. type:'post',
  14. data:MyFormData, // ***** 对象内部自带编码 自动识别
  15. processData:false, // 指定 process 处理 进程
  16. contentType:false 指定
  17. success:function(data){
  18. window.console.log('data')
  19. }
  20. })
  21. })

后端获取文件

  1. # 自动放在
  2. request.POST and request.FILES 里面

django自带的serializers

序列化的目的是 将数据整合成一个大字典的形式 方便数据交互

  1. from app01 import models
  2. def zzz(request):
  3. user_queryset = models.User.objects.all()
  4. user_list = []
  5. for user_obj in user_queryset:
  6. user_list.append({
  7. 'username': user_obj.username,
  8. 'password': user_obj.password,
  9. })
  10. return HttpResponse(user_list)

  1. def ser(request):
  2. #拿到用户表里面的所有的用户对象
  3. user_list=models.User.objects.all()
  4. #导入内置序列化模块
  5. from django.core import serializers
  6. #调用该模块下的方法,第一个参数是你想以什么样的方式序列化你的数据
  7. ret=serializers.serialize('json',user_list)
  8. return HttpResponse(ret)

django----orm查询优化 MTV与MVC模型 choice参数 ajax serializers的更多相关文章

  1. orm查询优化 MTV和MVC模型 字段的chioces参数 Ajax

    目录 一.ORM查询优化 1. all()查询 2. only()/defer()方法 (1)only()方法 (2)defer()方法 3. select_related()/prefetch_re ...

  2. ORM中choices参数(重要)、MTV于MVC模型、多对多关系三种创建方式

    choices参数(重要) **使用方式

  3. Django与AJAX-choice字段-MTV和MVC模型-sweetalert搭建页面

    Django中的choice字段 应用的场景: 用户信息举列:如用户性别.婚否.学历.工作状态等可以列举出来供选择的信息 书写models创建表模型: 数据的获取和查询: 总结: "&quo ...

  4. Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍

    创建一个 Django 项目及应用 django-admin startproject orm cd orm python manage.py startapp app01 在 models.py 上 ...

  5. Django ORM中常用的字段类型以及参数配置

    一.数值型 AutoField对应int(11).自增主键,Django Model默认提供,可以被重写. BooleanField对应tinyint(1).布尔类型字段,一般用于记录状态标记. De ...

  6. django 分页器,序列化 ,MTV MVC

    序列化组件## from django.core import serializers # django自带的一个小型的序列化工具# def reg(request):# user_list = mo ...

  7. (day55)七、查询优化、MTV和MCV、choices、AJAX、序列化

    目录 一.ORM查询优化 (一)only与defer (1)only (2)defer (二)select_related与prefatch_related (1)select_related (2) ...

  8. Django数据库查询优化与AJAX

    目录 数据库设计三大范式 orm相关的数据库查询优化 惰性查询 all.only与defer select_related与prefetch_related MTV与MVC模型 MTV(models ...

  9. Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器-批量插入-07

    目录 models 字段补充 choices 参数/字段(用的很多) MTV与MVC模型 科普 Ajax 发送 GET.POST 请求的几种常见方式 用 Ajax 做一个小案例 准备工作 动手用 Aj ...

随机推荐

  1. C. Present(二分 + 扫描线)

    题目链接:http://codeforces.com/contest/460/problem/C 题意: n盆花,浇k次水, 每次可使花高度 + 1, 每次可浇相邻的w盆,ai 表示 i-th盆花 的 ...

  2. 【论文阅读】Diverse Image-to-Image Translation via Disentangled Representations(ECCV2018 oral)

    目录 相关链接 方法亮点 相关工作 方法细节 实验结果 总结与收获 参考文献 相关链接: 论文:https://arxiv.org/abs/1808.00948 代码:https://github.c ...

  3. 2019-10-28:渗透测试学习,sqlmap的使用,笔记

    sqlmap工具的使用sql注入工具,明小子,啊D,萝卜头,穿山甲,sqlmap等开源自动化注入利用工具,支持的数据库有12种,在/plugins中可以看到支持的数据库种类,在所有注入利用工具中是最好 ...

  4. 在UEFI+GPT下使用rEFind实现Win10 + Kali2.0 双引导

    转载自:在UEFI+GPT下使用rEFind实现Win10 + Kali2.0 双引导 https://www.linuxidc.com/Linux/2016-07/133717.htm

  5. web网站常用功能测试点总结

    目录 一.输入框 二.搜索功能 三.添加.修改功能 四.删除功能 五.注册.登录模块 六.上传图片测试 七.查询结果列表 八.返回键检查 九.回车键检查 十.刷新键检查 十一.直接URL链接检查 十二 ...

  6. leetcode 114二叉树转换成链表

    解法一 可以发现展开的顺序其实就是二叉树的先序遍历.算法和 94 题中序遍历的 Morris 算法有些神似,我们需要两步完成这道题. 将左子树插入到右子树的地方 将原来的右子树接到左子树的最右边节点 ...

  7. Redis系列(三):Redis集群的水平扩展与伸缩

    一.Redis集群的水平扩展 Redis3.0版本以后,有了集群的功能,提供了比之前版本的哨兵模式更高的性能与可用性,但是集群的水平扩展却比较麻烦,接下来介绍下Redis高可用集群如何做水平扩展,在原 ...

  8. Bootstrap 元素居中设置

    一.Bootstrap水平居中 1. 文本:class ="text-center" 2. 图片居中:class = "center-block" 3.其他元素 ...

  9. 华为云BigData Pro解读: 鲲鹏云容器助力大数据破茧成蝶

    华为云鲲鹏云容器 见证BigData Pro蝶变之旅大数据之路顺应人类科技的进步而诞生,一直顺风顺水,不到20年时间,已渗透到社会生产和人们生活的方方面面,.然而,伴随着信息量的指数级增长,大数据也开 ...

  10. [ch05-00] 多变量线性回归问题

    系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 第5章 多入单出的单层神经网络 5.0 多变量线性回归问 ...