聚合查询

  1. # 聚合查询 aggregate
  2. """
  3. 聚合查询通常情况下都是配合分组一起使用的
  4. 只要是跟数据库相关的模块
  5. 基本上都在django.db.models里面
  6. 如果上述没有那么应该在django.db里面
  7. """
  8. from app01 import models
  9. from django.db.models import Max,Min,Sum,Count,Avg
  10. # 1 所有书的平均价格
  11. # res = models.Book.objects.aggregate(Avg('price'))
  12. # print(res)
  13. # 2.上述方法一次性使用
  14. res = models.Book.objects.aggregate(Max('price'),Min('price'),Sum('price'),Count('pk'),Avg('price'))
  15. print(res)

分组查询

  1. # 分组查询 annotate
  2. """
  3. MySQL分组查询都有哪些特点
  4. 分组之后默认只能获取到分组的依据 组内其他字段都无法直接获取了
  5. 严格模式
  6. ONLY_FULL_GROUP_BY
  7. """
  8. from django.db.models import Max, Min, Sum, Count, Avg
  9. # 1.统计每一本书的作者个数
  10. # res = models.Book.objects.annotate() # models后面点什么 就是按什么分组
  11. # res = models.Book.objects.annotate(author_num=Count('authors')).values('title','author_num')
  12. """
  13. author_num是我们自己定义的字段 用来存储统计出来的每本书对应的作者个数
  14. """
  15. # res1 = models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')
  16. # print(res,res1)
  17. """
  18. 代码没有补全 不要怕 正常写
  19. 补全给你是pycharm给你的 到后面在服务器上直接书写代码 什么补全都没有 颜色提示也没有
  20. """
  21. # 2.统计每个出版社卖的最便宜的书的价格(作业:复习原生SQL语句 写出来)
  22. # res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name','min_price')
  23. # print(res)
  24. # 3.统计不止一个作者的图书
  25. # 1.先按照图书分组 求每一本书对应的作者个数
  26. # 2.过滤出不止一个作者的图书
  27. # res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num')
  28. # """
  29. # 只要你的orm语句得出的结果还是一个queryset对象
  30. # 那么它就可以继续无限制的点queryset对象封装的方法
  31. #
  32. # """
  33. # print(res)
  34. # 4.查询每个作者出的书的总价格
  35. # res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')
  36. # print(res)
  37. """
  38. 如果我想按照指定的字段分组该如何处理呢?
  39. models.Book.objects.values('price').annotate()
  40. 后续BBS作业会使用
  41. 你们的机器上如果出现分组查询报错的情况
  42. 你需要修改数据库严格模式
  43. """

F与Q查询

  1. # F查询
  2. # 1.查询卖出数大于库存数的书籍
  3. # F查询
  4. """
  5. 能够帮助你直接获取到表中某个字段对应的数据
  6. """
  7. from django.db.models import F
  8. # res = models.Book.objects.filter(maichu__gt=F('kucun'))
  9. # print(res)
  10. # 2.将所有书籍的价格提升500块
  11. # models.Book.objects.update(price=F('price') + 500)
  12. # 3.将所有书的名称后面加上爆款两个字
  13. """
  14. 在操作字符类型的数据的时候 F不能够直接做到字符串的拼接
  15. """
  16. from django.db.models.functions import Concat
  17. from django.db.models import Value
  18. models.Book.objects.update(title=Concat(F('title'), Value('爆款')))
  19. # models.Book.objects.update(title=F('title') + '爆款') # 所有的名称会全部变成空白
  1. # Q查询
  2. # 1.查询卖出数大于100或者价格小于600的书籍
  3. # res = models.Book.objects.filter(maichu__gt=100,price__lt=600)
  4. """filter括号内多个参数是and关系"""
  5. from django.db.models import Q
  6. # res = models.Book.objects.filter(Q(maichu__gt=100),Q(price__lt=600)) # Q包裹逗号分割 还是and关系
  7. # res = models.Book.objects.filter(Q(maichu__gt=100)|Q(price__lt=600)) # | or关系
  8. # res = models.Book.objects.filter(~Q(maichu__gt=100)|Q(price__lt=600)) # ~ not关系
  9. # print(res) # <QuerySet []>
  10. # Q的高阶用法 能够将查询条件的左边也变成字符串的形式
  11. q = Q()
  12. q.connector = 'or'
  13. q.children.append(('maichu__gt',100))
  14. q.children.append(('price__lt',600))
  15. res = models.Book.objects.filter(q) # 默认还是and关系
  16. print(res)

django中如何开启事务

  1. """
  2. 事务
  3. ACID
  4. 原子性
  5. 不可分割的最小单位
  6. 一致性
  7. 跟原子性是相辅相成
  8. 隔离性
  9. 事务之间互相不干扰
  10. 持久性
  11. 事务一旦确认永久生效
  12. 事务的回滚
  13. rollback
  14. 事务的确认
  15. commit
  16. """
  17. # 目前你只需要掌握Django中如何简单的开启事务
  18. # 事务
  19. from django.db import transaction
  20. try:
  21. with transaction.atomic():
  22. # sql1
  23. # sql2
  24. ...
  25. # 在with代码快内书写的所有orm操作都是属于同一个事务
  26. except Exception as e:
  27. print(e)
  28. print('执行其他操作')

orm中常用字段及参数

  1. AutoField
  2. 主键字段 primary_key=True
  3. CharField varchar
  4. verbose_name 字段的注释
  5. max_length 长度
  6. IntegerField int
  7. BigIntegerField bigint
  8. DecimalField
  9. max_digits=8
  10. decimal_places=2
  11. EmailFiled varchar(254)
  12. DateField date
  13. DateTimeField datetime
  14. auto_now:每次修改数据的时候都会自动更新当前时间
  15. auto_now_add:只在创建数据的时候记录创建时间后续不会自动修改了
  16. BooleanField(Field) - 布尔值类型
  17. 该字段传布尔值(False/True) 数据库里面存0/1
  18. TextField(Field) - 文本类型
  19. 该字段可以用来存大段内容(文章、博客...) 没有字数限制
  20. 后面的bbs作业 文章字段用的就是TextField
  21. FileField(Field) - 字符类型
  22. upload_to = "/data"
  23. 给该字段传一个文件对象,会自动将文件保存到/data目录下然后将文件路径保存到数据库中
  24. /data/a.txt
  25. 后面bbs作业也会涉及
  26. # 更多字段
  27. 直接参考博客:https://www.cnblogs.com/Dominic-Ji/p/9203990.html
  28. # django除了给你提供了很多字段类型之外 还支持你自定义字段
  29. class MyCharField(models.Field):
  30. def __init__(self,max_length,*args,**kwargs):
  31. self.max_length = max_length
  32. # 调用父类的init方法
  33. super().__init__(max_length=max_length,*args,**kwargs) # 一定要是关键字的形式传入
  34. def db_type(self, connection):
  35. """
  36. 返回真正的数据类型及各种约束条件
  37. :param connection:
  38. :return:
  39. """
  40. return 'char(%s)'%self.max_length
  41. # 自定义字段使用
  42. myfield = MyCharField(max_length=16,null=True)
  43. # 外键字段及参数
  44. unique=True
  45. ForeignKey(unique=True) === OneToOneField()
  46. # 你在用前面字段创建一对一 orm会有一个提示信息 orm推荐你使用后者但是前者也能用
  47. db_index
  48. 如果db_index=True 则代表着为此字段设置索引
  49. (复习索引是什么)
  50. to_field
  51. 设置要关联的表的字段 默认不写关联的就是另外一张的主键字段
  52. on_delete
  53. 当删除关联表中的数据时,当前表与其关联的行的行为。
  54. """
  55. django2.X及以上版本 需要你自己指定外键字段的级联更新级联删除
  56. """

数据库查询优化

  1. onlydefer
  2. select_relatedprefetch_related
  3. """
  4. orm语句的特点:
  5. 惰性查询
  6. 如果你仅仅只是书写了orm语句 在后面根本没有用到该语句所查询出来的参数
  7. 那么orm会自动识别 直接不执行
  8. """
  9. # only与defer
  10. # res = models.Book.objects.all()
  11. # print(res) # 要用数据了才会走数据库
  12. # 想要获取书籍表中所有数的名字
  13. # res = models.Book.objects.values('title')
  14. # for d in res:
  15. # print(d.get('title'))
  16. # 你给我实现获取到的是一个数据对象 然后点title就能够拿到书名 并且没有其他字段
  17. # res = models.Book.objects.only('title')
  18. # res = models.Book.objects.all()
  19. # print(res) # <QuerySet [<Book: 三国演义爆款>, <Book: 红楼梦爆款>, <Book: 论语爆款>, <Book: 聊斋爆款>, <Book: 老子爆款>]>
  20. # for i in res:
  21. # print(i.title) # 点击only括号内的字段 不会走数据库
  22. # print(i.price) # 点击only括号内没有的字段 会重新走数据库查询而all不需要走了
  23. res = models.Book.objects.defer('title') # 对象除了没有title属性之外其他的都有
  24. for i in res:
  25. print(i.price)
  26. """
  27. defer与only刚好相反
  28. defer括号内放的字段不在查询出来的对象里面 查询该字段需要重新走数据
  29. 而如果查询的是非括号内的字段 则不需要走数据库了
  30. """
  31. # select_related与prefetch_related
  32. # select_related与prefetch_related 跟跨表操作有关
  33. # res = models.Book.objects.all()
  34. # for i in res:
  35. # print(i.publish.name) # 每循环一次就要走一次数据库查询
  36. # res = models.Book.objects.select_related('authors') # INNER JOIN
  37. """
  38. select_related内部直接先将book与publish连起来 然后一次性将大表里面的所有数据
  39. 全部封装给查询出来的对象
  40. 这个时候对象无论是点击book表的数据还是publish的数据都无需再走数据库查询了
  41. select_related括号内只能放外键字段 一对多 一对一
  42. 多对多也不行
  43. """
  44. # for i in res:
  45. # print(i.publish.name) # 每循环一次就要走一次数据库查询
  46. res = models.Book.objects.prefetch_related('publish') # 子查询
  47. """
  48. prefetch_related该方法内部其实就是子查询
  49. 将子查询查询出来的所有结果也给你封装到对象中
  50. 给你的感觉好像也是一次性搞定的
  51. """
  52. for i in res:
  53. print(i.publish.name)

图书管理系统

作业

  1. """
  2. 1.整理今日内容到博客
  3. 2.熟练掌握数据库常用字段及参数以及应用场景
  4. 3.总结数据库查询优化的两组方法,尝试用自己的语言表述
  5. 4.完成图书管理系统
  6. 书籍表的增删改查(尽量将之前的知识点全部融入进去)
  7. """

Django---进阶6的更多相关文章

  1. Python之路,Day16 - Django 进阶

    Python之路,Day16 - Django 进阶   本节内容 自定义template tags 中间件 CRSF 权限管理 分页 Django分页 https://docs.djangoproj ...

  2. django进阶补充

    前言: 这篇博客对上篇博客django进阶作下补充. 一.效果图 前端界面较简单(丑),有两个功能: 从数据库中取出书名 eg: 新书A 在form表单输入书名,选择出版社,选择作者(多选),输入完毕 ...

  3. django进阶-3

    先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin, 使界面更牛逼 数据库表结构: app01/models.py from django.db import models ...

  4. django进阶-4

    前言: 下篇博客写关于bootstrap... 一.如何在脚本测试django from django.db import models class Blog(models.Model): name ...

  5. Django进阶篇【1】

    注:本篇是Django进阶篇章,适合人群:有Django基础,关于Django基础篇,将在下一章节中补充! 首先我们一起了解下Django整个请求生命周期: Django 请求流程,生命周期: 路由部 ...

  6. Django进阶知识

    drf学习之Django进阶点 一.Django migrations原理 1.makemigrattions: 相当于在每个app下的migrations文件夹下生成一个py脚本文件用于创建表或则修 ...

  7. django进阶-查询(适合GET4以上人群阅读)

    前言: 下篇博客写关于bootstrap... 一.如何在脚本测试django from django.db import models class Blog(models.Model): name ...

  8. django进阶-modelform&admin action

    先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin, 使界面更牛逼 数据库表结构: app01/models.py from django.db import models ...

  9. django进阶-小实例

    前言: 这篇博客对上篇博客django进阶作下补充. 一.效果图 前端界面较简单(丑),有两个功能: 从数据库中取出书名 eg: 新书A 在form表单输入书名,选择出版社,选择作者(多选),输入完毕 ...

  10. django进阶-1

    前言: 各位久等了,django进阶篇来了. 一.get与post 接口规范: url不能写动词,只能写名词 django默认只支持两种方式: get, post get是获取数据 ?user=zcl ...

随机推荐

  1. centos7 yum源更新

    先进入到yum源文件cd /etc/yum.repo.d/  1.创建一个repo_bak目录,用于保存系统中原来yum的repo文件. sudo mkdir repo_bak 2.备份yum源文件至 ...

  2. 如何0基础学习C/C++?

    谈及C/C++,功能强大.应用广泛,一旦掌握了后,若是再自学其他语言就显得轻而易举了.那为什么学C/C++的人少呢?很多人认为C/C++虽然博大精深,但也难学.其实就本人认为C/C++并非是“diff ...

  3. 【asp.net core】7 实战之 数据访问层定义

    0. 前言 在上一篇,我们搭建了一个项目框架,基本上是一个完整的项目.目前而言,大部分的应用基本都是这个结构.好的,不废话了,进入今天的议题:完成并实现数据层的基础实现. 1. 数据实体 通常情况下, ...

  4. 计算从1到n中,出现某位数字的次数

    出现1-9中某位数字次数的算法 /** * @param input 整数n(1 ≤ n ≤ 1,000,000,000) * @return 1-9中某个数字在数列中出现的次数 */ public ...

  5. Redis集群方式

    Redis有三种集群方式:主从复制,哨兵模式和集群. 1.主从复制 主从复制原理: 从服务器连接主服务器,发送SYNC命令: 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用 ...

  6. JPA 中 find() 和 getReference() 的区别

    在查询的时候有两个方法:find()和getReference(),这两个方法的参数以及调用方式都相同.那么这两个方法有什么不一样的呢? find()称为 立即加载,顾名思义就是在调用的时候立即执行查 ...

  7. @bzoj - 4035@ [HAOI2015]数组游戏

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 有一个长度为N的数组,甲乙两人在上面进行这样一个游戏: 首先,数 ...

  8. Java——八种基本数据类型(常用类)

    装箱和拆箱 装箱:基本数据类型转为包装类 拆箱:包装类转为基本数据类型 jdk1.5(即jdk5.0)之后的版本都提供了自动装箱和自动拆箱功能 基本数据类型的包装类 举两个例子,看一下 public ...

  9. RANK()的对比(SQL, Minitab, Excel)

    RANK()的对比(SQL, Minitab, Excel)也不是想来做什么对比的,只是顺便写此文,想学习一下Minitab的应用以便用它分析解决实际的问题. 回顾 May 23文章“开窗函数_ROW ...

  10. linux kernel update

    linux内核升级 最近HW行动,报出来的linux系统内核漏洞,环境中全部是2.6.32-431.el6.x86_64的主机,需要全部升级到754版本,这也是第一次进行内核升级操作. 先找了一台和生 ...