ORM查询优化、ORM事物操作、ORM常用字段参数、Ajax请求、Content-Type

Q查询进阶操作

  1. 先产生一个对象
  2. q_obj = Q()
  3. 修改默认对象
  4. q_obj.connector = 'or'
  5. 添加查询条件,可以添加多个查询条件,第一个写一个字符串的字段名,第二个写元素具体的值
  6. q_obj.children.append(('pk',1))
  7. q_objchildren.append(('price__gt'))
  8. 添加好以后q对象支持直接用filter进行筛选
  9. res = models.Book.objects.filter(q)
  10. print(res)

ORM查询优化

  1. 1.ORM的查询默认都是惰性查询
  2. 2.ORM的查询自带分页处理
  3. 3.onlydefer
  4. '''数据对象+含有指定字段对应的数据'''
  5. # res = models.Book.objects.only('title', 'price')
  6. # print(res) # queryset [数据对象、数据对象]
  7. # for obj in res:
  8. # print(obj.title) # 点击括号内填写的字段 不走SQL查询
  9. # print(obj.price)
  10. # print(obj.publish_time) # 可以点击括号内没有的字段获取数据 但是会走SQL查询
  11. res = models.Book.objects.defer('title', 'price')
  12. # print(res) # queryset [数据对象、数据对象]
  13. for obj in res:
  14. # print(obj.title) # 点击括号内填写的字段 走SQL查询
  15. # print(obj.price)
  16. print(obj.publish_time) # 点击括号内没有的字段获取数据 不走SQL查询
  17. 4.select_relatedprefetch_related
  18. # res = models.Book.objects.all()
  19. # for obj in res:
  20. # print(obj.publish.name) # 每次查询都需要走SQL
  21. # res = models.Book.objects.select_related('authors') # 先连表后查询封装
  22. # res1 = models.Author.objects.select_related('author_detail') # 括号内不支持多对多字段 其他两个都可以
  23. # print(res1)
  24. # for obj in res:
  25. # print(obj.publish.name) # 不再走SQL查询
  26. res = models.Book.objects.prefetch_related('publish') # 子查询
  27. for obj in res:
  28. print(obj.publish.name)

ORM事物操作

  1. 1.事物的四大特性(ACID)
  2. 原子性、一致性、隔离性、持久性
  3. 2.相关sql关键字
  4. 开启事物:start transaction
  5. 回滚:rollback
  6. 确认:commit
  7. 保存点:savepoint
  8. 3.django orm提供了至少三种开启事务的方式
  9. 方式1:配置文件数据库相关添加键值对 全局有效
  10. "ATOMIC_REQUESTS": True每次请求所涉及到的orm操作同属于一个事务
  11. 方式2:装饰器 局部有效
  12. from django.db import transaction
  13. @transaction.atomic
  14. def index():pass
  15. 方式3:with上下文管理 局部有效
  16. from django.db import transaction
  17. def reg():
  18. with transaction.atomic():
  19. pass

ORM常用字段类型

  1. 1.AutoField(int自增序列)
  2. int自增序列,必须填入的参数primary_key=True,如果没有自增的序列,则会自动创建一个列名为id的列。
  3. 2.CharField(varchar)
  4. verbose_name:字段的注释
  5. max_length:字符长度
  6. 3.IntegerField(int)
  7. 4.BigIntegerField(bigint)
  8. 5.DecimalField(decimal)
  9. max_digits:总共的位数
  10. decimal_places:小数位
  11. 6.EmailField(varchar(254))
  12. 7.DateField(date)
  13. 日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例
  14. 8.DateTimeField(datetime)
  15. 日期时间字段,格式 YYYY-MM-DD HH:MM:SS,相当于Python中的datetime.datetime()实例
  16. auto_now:每次修改数据的时候会自动更新当前 的时间
  17. auto_now_add:在创建数据的时候记录创建时间后续不会自动修改了
  18. 9.BoolField(field)(布尔值类型)
  19. 该字段传布尔值(False/True) 数据库里面存0/1
  20. 10.TextField(Field)(文本类型)
  21. 该字段可以用来存大段内容(文章、博客...) 没有字数限制
  22. 后面的bbs作业 文章字段用的就是TextField
  23. 11.FileField(Field)(字符类型)
  24. upload_to = "/data"
  25. 给该字段传一个文件对象,会自动将文件保存到/data目录下然后将文件路径保存到数据库中
  26. /data/a.txt
  27. 12.ForeignKey()()外键
  28. 13.OneToOneField()(一对一关系)
  29. 14.ManyToManyField()(多对多关系)

ORM还支持自定义字段

  1. # 定义char类型
  2. # 字段类内部都继承Field
  3. class MyCharField(models.Field):
  4. # 字符类型都必须有max_length表示字符长度
  5. def __init__(self,max_length, *args, **kwargs):
  6. self.max_length = max_length
  7. # 调用父类的init方法
  8. super().__init__(max_length=max_length, *args, **kwargs) # 一定要是关键字的形式传入
  9. def db_type(self, connection):
  10. # 返回真真正的数据类型及各种约束条件
  11. return 'char(%s)' % self.max_length
  12. # 自定义字段使用
  13. myfield = MyCharField(max_length=16,null=True) # 可以为空

ORM常用字段参数

  1. primary_key 主键
  2. verbose_name 注释
  3. max_length 字段长度
  4. max_digits 小数总共多少位
  5. decimal_places 小数点后面的位数
  6. auto_now 每次操作数据自动更新事件
  7. auto_now_add 首次创建自动更新事件后续不自动更新
  8. null 允许字段为空
  9. default 字段默认值
  10. unique 唯一值
  11. db_index 给字段添加索引
  12. choices 当某个字段的可能性能够被列举完全的情况下使用
  13. 性别、学历、工作状态、...
  14. class User(models.Model):
  15. name = models.CharField(max_length=32)
  16. info = MyCharField(max_length=64)
  17. # 提前列举好对应关系
  18. gender_choice = (
  19. (1, '男性'),
  20. (2, '女性'),
  21. (3, '其他'),
  22. )
  23. gender = models.IntegerField(choices=gender_choice,null=True)
  24. user_obj = User.objects.filter(pk=1).first()
  25. user_obj.gender
  26. user_obj.get_gender_display()
  27. to 关联表
  28. to_field 关联字段(不写默认关联数据主键)
  29. on_delete 当删除关联表中的数据时,当前表与其关联的行的行为。
  30. 1models.CASCADE
  31. 级联操作,当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除
  32. 2models.SET_NULL
  33. 当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null,此时注意定义外键时,这个字段必须可以允许为空
  34. 3models.PROTECT
  35. 当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除
  36. 4models.SET_DEFAULT
  37. 当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段应该有一个默认值
  38. 5models.SET()
  39. 当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值,与models.SET_DEFAULT相似,只不过此时从表中的相关字段不需要设置default参数
  40. 6models.DO_NOTHING
  41. 什么都不做,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT,这个约束与django中的models.PROTECT相似

Ajax

  1. 特点:异步提交,局部刷新
  2. ajax不是一门新的技术并且有很多版本 我们目前学习的是jQuery版本(版本无所谓 本质一样就可以)
  3. 异步提交,局部刷新的效果如图所示:

  1. ajax的基本语法:
  2. $.ajax({
  3. url:'' //后端的地址,三种填写方式
  4. type:'post' //请求方式,默认为get
  5. data:{'v1':v1Val,'v2':v2Val} //发送数据
  6. success:function(args){ //异步回调函数
  7. // 后端返回结果之后自动触发 args接收后端返回的数据
  8. $('#d3').val(args)
  9. }
  10. })

Ajax的小案例

  1. url:
  2. urlpatterns = [
  3. path('admin/', admin.site.urls),
  4. path('ab_ajax/', views.ab_ajax_func)
  5. ]
  1. views:
  2. def ab_ajax_func(request):
  3. if request.method == 'POST':
  4. print(request.POST)
  5. v1 = request.POST.get('v1')
  6. v2 = request.POST.get('v2')
  7. res = int(v1) + int(v2)
  8. return HttpResponse(res)
  9. return render(request, 'abAjaxPage.html')
  1. abAjaxPage.html:
  2. <input type="text" id="d1"> + <input type="text" id="d2"> = <input type="text" id="d3">
  3. <button id="subBtn">点我发送ajax请求</button>
  4. <script>
  5. // 2.给按钮绑定点击事件
  6. $('#d2').blur(function () {
  7. // 1.先获取两个框里面的数据
  8. let v1Val = $('#d1').val();
  9. let v2Val = $('#d2').val();
  10. // 3.发送ajax请求
  11. $.ajax({
  12. url:'', // 后端地址 三种填写方式 与form标签的action一致
  13. type:'post', // 请求方式 默认也是get
  14. data:{'v1':v1Val, 'v2':v2Val}, // 发送的数据
  15. success:function (args) { // 后端返回结果之后自动触发 args接收后端返回的数据
  16. $('#d3').val(args)
  17. }
  18. })
  19. })
  20. </script>

Content-Type

  1. 1.urlencoded
  2. ajax默认的编码格式、form表单默认也是
  3. 数据格式 xxx=yyy&uuu=ooo&aaa=kkk
  4. django后端会自动处理到request.POST
  5. 2.formdata
  6. django后端针对普通的键值对还是处理到request.POST 但是针对文件会处理到request.FILES
  7. 3.application/json
  8. form表单不支持 ajax可以
  9. <script>
  10. $('#d1').click(function () {
  11. $.ajax({
  12. url:'',
  13. type:'post',
  14. data:JSON.stringify({'name':'jason','age':18}), // 千万不要骗人家
  15. contentType:'application/json',
  16. success:function (args) {
  17. alert(args)
  18. }
  19. })
  20. })
  21. </script>
  22. 后端需要从request.body中获取并自己处理

ajax携带文件数据

  1. <script>
  2. $('#d3').click(function () {
  3. // 1.先产生一个FormData对象
  4. let myFormDataObj = new FormData();
  5. // 2.往该对象中添加普通数据
  6. myFormDataObj.append('name', 'jason');
  7. myFormDataObj.append('age', 18);
  8. // 3.往该对象中添加文件数据
  9. myFormDataObj.append('file', $('#d2')[0].files[0])
  10. // 4.发送ajax请求
  11. $.ajax({
  12. url:'',
  13. type:'post',
  14. data:myFormDataObj,
  15. // ajax发送文件固定的两个配置
  16. contentType:false,
  17. processData:false,
  18. success:function (args){
  19. alert(args)
  20. }
  21. })
  22. })
  23. </script>

(补12月19)ORM查询优化、ORM事物操作、ORM常用字段参数、Ajax请求、Content-Type的更多相关文章

  1. 2016年12月19日 星期一 --出埃及记 Exodus 21:14

    2016年12月19日 星期一 --出埃及记 Exodus 21:14 But if a man schemes and kills another man deliberately, take hi ...

  2. 北京Uber优步司机奖励政策(12月19日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. 24.mongodb可视化工具部署——2019年12月19日

    2019年10月09日17:05:54 教程链接:https://blog.csdn.net/qq_32340877/article/details/79142129 项目名:adminMongo g ...

  4. 22.Express框架——2019年12月19日

    2019年12月19日14:16:36 1. express简介 1.1 介绍 Express框架是后台的Node框架,所以和jQuery.zepto.yui.bootstrap都不一个东西. Exp ...

  5. 根据随身固态U盘卷标搜索U盘盘符并打开文件的批处理脚本.bat 徐晓亮 595076941@qq.com 2019年12月19日6点50分

    @Echo offRem 根据随身固态U盘卷标搜索U盘盘符并打开文件的批处理脚本.batRem 徐晓亮 595076941@qq.com 2019年12月19日6点50分 Rem 此批处理脚本源代码的 ...

  6. 32.密码学知识-SSL/TLS-9——2019年12月19日

    9. SSL/TLS "SSL/TLS --- 为了更安全的通信" 本章中我们将学习SSL/TLS的相关知识. SSL/TLS是世界上应用最广泛的密码通信方法.比如说,当在网上商城 ...

  7. 31.密码学知识-证书CA/PKI-8——2019年12月19日

    1. 证书 公钥证书(Public-Key Certificate,PKC)其实和驾照很相似,里面记有姓名.组织.邮箱地址等个人信息,以及属于此人的公钥, 并由认证机构(Certification A ...

  8. Week15(12月19日):授课综述2

    Part I:提问 =========================== 1.为了编辑应用程序的统一布局,可打开位于Views\Shared子目录中的(    )文件. A.MasterPage.h ...

  9. 29.密码学知识-消息认证码MAC-6——2019年12月19日

    1. 消息认证码 1.1 消息认证 消息认证码(message authentication code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC. 思考改进方案? 从哈希函数 ...

  10. 28.密码学知识-hash函数-5——2019年12月19日

    5. 单向散列函数 "单向散列函数 --- 获取消息的指纹" 在刑事侦查中,侦查员会用到指纹.通过将某个特定人物的指纹与犯罪现场遗留的指纹进行对比,就能够知道该人物与案件是否存在关 ...

随机推荐

  1. Seata 环境搭建

    在使用微服务中,单体事务注解@Transactional 就不适用了,需要采用分布式事务解决方案,本文介绍分布式事务Seata的安装.Seata一款开源的分布式事务解决方案,致力于在微服务架构下提供高 ...

  2. Sqlite 安装操作使用

    一.什么是 SQLite 数据库 SQLite 是嵌入式SQL数据库引擎.与大多数其他 SQL 数据库不同,SQLite 没有单独的服务器进程.SQLite 直接读取和写入普通磁盘文件.具有多个表,索 ...

  3. js高级基础部分

    基于尚硅谷的尚硅谷JavaScript高级教程提供笔记撰写,加入一些个人理解 github源码 博客下载 数据类型的分类和判断 主要问题 分类 基本(值)类型 Number ----- 任意数值 -- ...

  4. Idea在windows和mac中的一些快捷指令

    从 Windows 过度到 Mac 必备快捷键对照表 Mac 键盘符号说明 ⌘ == Command ⇧ == Shift ⇪ == Caps Lock ⌥ == Option ⌃ == Contro ...

  5. 云实例初始化工具cloud-init简介

    项目简介 cloud-init是一款用于初始化云服务器的工具,它拥有丰富的模块,能够为云服务器提供的能力有:初始化密码.扩容根分区.设置主机名.注入公钥.执行自定义脚本等等,功能十分强大. 目前为止c ...

  6. flex布局中,元素等间距设置,包括第一个元素的左边,最后一个元素的右边,也等间距

    项目中很多地方会用到等间距排放的场景,使用flex 布局可以很方便的实现 .fu{ display: flex; ustify-content: space-between; } 通过上面代码,可以实 ...

  7. IOS AND Android 配置Fiddler环境

    下载:http://rj.baidu.com/soft/detail/10963.html?ald 运行Fiddler点击Tools: 选择设置选项:   1.     选择HTTPS新选项卡. 2. ...

  8. goioc:一个使用 Go 写的简易的 ioc 框架

    目录 goioc 介绍 快速上手 接口介绍 使用 goioc 如何使用 生命周期 实例化 获取对象 结构体字段依赖注入 Dispose 接口 反射形式使用 goioc 如何使用 接口.结构体.结构体指 ...

  9. Task01:Matplotlib初相识

    一.明晰绘制一张图的组成条件 Figure:最基本的一级 Axes:在Figure上创建子图的容器(如果Figure中仅含一子图,则该容器可省略) Axis:用于处理子图上和坐标轴和网格相关的元素 T ...

  10. JVM面试点汇总

    JVM面试点汇总 我们会在这里介绍我所涉及到的JVM相关的面试点内容,本篇内容持续更新 我们会介绍下述JVM的相关面试点: JVM内存结构 内存溢出问题 方法区与永久代和元空间 JVM内存参数 JVM ...