一、图书管理系统讲解

  1. 1.表设计
  2. 先考虑普通字段再考虑外键字段
  3. 数据库迁移、测试数据录入
  4. 2.首页展示
  5. 3.书籍展示
  6. 4.书籍添加
  7. 5.书籍编辑
  8. 后端如何获取用户想要编辑的数据、前端如何展示出待编辑的数据
  9. 6.书籍删除

二、聚合查询

在ORM中支持单独使用聚合函数,需要使用aggregate方法。

聚合函数:Max最大、Min最小、Sum总和、Avg平均、count统计

示例1

  1. from django.db.models import Max, Min, Sum, Count, Avg
  2. res = models.Book.objects.aggregate(Max('price'), Count('pk'), 最小价格=Min('price'), allPrice=Sum('price'),平均价格=Avg('price'))
  3. print(res)

ps:我们在进行聚合查询的时候,可以给聚合查询的内容命名,如果不主动命名,也会自动用下划线拼接两个字段名,但是这里的命名不建议用中文(虽然能用)。

示例2


  1. from django.db.models import Max, Min, Sum, Avg, Count
  2. 1.查找所有书籍中价格最高的书籍
  3. res = models.Book.objects.aggregate(我是世界上最贵的书=Max('price'))
  4. print(res) # 没有分组之前如果单纯的时候聚合函数 需要关键字aggregate
  5. 2.获取书籍中最贵的 最便宜的 全部需要多少钱 平均一本书多少钱 总共有几本书
  6. res1 = models.Book.objects.aggregate(Max('price'), Min('price'), Sum('price'), Avg('price'), Count('pk'))
  7. print(res1)
  8. '''通过 别名 = 聚合函数的方法可以取一个别名'''

三、分组查询

小提示:

如果执行orm分组查询报错,并且有关键字sql_mode,需要去mysql配置文件中修改严格模式的配置信息。(Mac不会有)

  1. strict mode
  2. 移除sql_mode中的only_full_group_by

  1. # 分组查询
  2. from django.db.models import Max, Min, Sum, Count, Avg
  3. # 统计每一本书的作者个数
  4. res = models.Book.objects.annotate(author_num=Count('authors__pk')).values('title', 'author_num')
  5. print(res)
  6. # 统计出每个出版社卖的最便宜的书的价格
  7. res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
  8. print(res)
  9. # 统计不止一个作者的图书
  10. # 1.先统计每本书的作者个数
  11. res = models.Book.objects.annotate(author_num=Count('authors__pk'))
  12. print(res)
  13. # 2.筛选出作者个数大于1的数据
  14. res = models.Book.objects.annotate(author_num=Count('authors__pk')).filter(author_num__gt=1).values('title',
  15. 'author_num')
  16. print(res)
  17. # 查询每个作者出的书的总价格
  18. """
  19. models.表名.objects.annotate() 按照表分组
  20. models.表名.objects.values('字段名').annotate() 按照values括号内指定的字段分组
  21. """
  22. res = models.Author.objects.annotate(总价=Sum('book__price'),count_book=Count('book__pk')).values('name','总价','count_book')
  23. print(res)
  24. res = models.Book.objects.values('publish_id').annotate(count_pk=Count('pk')).values('publish_id', 'count_pk')
  25. print(res)

四、ORM中如何给表再次添加新的字段

当我们在对数据库使用ORM进行操作的时候,如果出现需要新增字段的情况,在模型层中修改了代码后,进行数据库迁移操作前,需要对新增的字段值进行设置,否则不让进行数据库迁移。

我们可以把字段值设置成一个固定的值,也可以设置字段值可以为空。

代码

  1. 首先我们先给我们的书籍表格再添加两条数据(库存以及已销售)
  2. storage_num = models.IntegerField(verbose_name='库存数')
  3. sale_num = models.IntegerField(verbose_name='已销售')
  4. 但是出现报错了
  5. we can't do that (the database needs something to populate existing rows)
  6. 现在这张表已经有数据了 再添加两个新的字段 没有数据值 它的数据值呢 ?
  7. 两种方式 一个默认值 一个退出不执行这个命令再去修改(所以我们得给他加上数据)
  8. storage_num = models.IntegerField(verbose_name='库存数', null=True)
  9. sale_num = models.IntegerField(verbose_name='已销售', default=1000)

如果不对新的字段值进行设置会出现一下提示:

五、F与Q查询

F查询

  1. # 1.查询库存数大于卖出数的书籍
  2. '''当查询条件不是明确的 也需要从数据库中获取 就需要使用F查询'''
  3. from django.db.models import F
  4. res = models.Book.objects.filter(kucun__gt=F('maichu'))
  5. print(res)
  6. # 2.将所有书的价格涨800
  7. models.Book.objects.update(price=F('price') + 800)
  8. # 3.将所有书的名称后面追加爆款
  9. from django.db.models.functions import Concat
  10. from django.db.models import Value
  11. models.Book.objects.update(title=Concat(F('title'), Value('新款')))

在用ORM进行查询的时候,我们会发现当查询条件不明确的时候不能执行语句,因此需要用到F查询。

Q查询

  1. # 查询主键是1或者价格大于2000的书籍
  2. res = models.Book.objects.filter(pk=1, price__gt=2000) # 逗号默认是and关系
  3. from django.db.models import Q
  4. res = models.Book.objects.filter(Q(pk=1), Q(price__gt=2000)) # 逗号是and
  5. res = models.Book.objects.filter(Q(pk=1) | Q(price__gt=2000)) # |是or
  6. res = models.Book.objects.filter(~Q(pk=1) | Q(price__gt=2000)) # ~是not
  7. print(res.query)

六、作业

练习图书管理系统(可以优化扩展)

12月16日内容总结——图书管理系统、聚合与分组查询、F与Q查询的更多相关文章

  1. 20.Nodejs基础知识(上)——2019年12月16日

    2019年12月16日18:58:55 2019年10月04日12:20:59 1. nodejs简介 Node.js是一个让JavaScript运行在服务器端的开发平台,它让JavaScript的触 ...

  2. 19.go语言基础学习(下)——2019年12月16日

    2019年12月16日16:57:04 5.接口 2019年11月01日15:56:09 5.1 duck typing 1. 2. 接口 3.介绍 Go 语言的接口设计是非侵入式的,接口编写者无须知 ...

  3. 16.go语言基础学习(上)——2019年12月16日

    2019年12月13日10:35:20 1.介绍 2019年10月31日15:09:03 2.基本语法 2.1 定义变量 2019年10月31日16:12:34 1.函数外必须使用var定义变量 va ...

  4. 2016年12月16日 星期五 --出埃及记 Exodus 21:11

    2016年12月16日 星期五 --出埃及记 Exodus 21:11 If he does not provide her with these three things, she is to go ...

  5. 12月16日广州.NET俱乐部下午4点爬白云山活动

    正如我们在<广州.NET微软技术俱乐部与其他技术群的区别>和<广州.NET微软技术俱乐部每周三五晚周日下午爬白云山活动>里面提到的, 我们会在每周三五晚和周日下午爬白云山.   ...

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

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

  7. 21.Nodejs基础知识(下)——2019年12月16日

    2019年10月04日16:56:23 7. 模块 7.1 暴露一个类,字段 var bar = require("./bar.js"); var msg = "你好&q ...

  8. Week15(12月16日):授课综述1

    Part I:提问 =========================== 1.(   )类提供了一个对Entity Framework的抽象,能够进行数据持久化并接受数据. A.Layout    ...

  9. 12月16日 增加一个购物车内product数量的功能, 自定义method,在helper中定义,计算代码Refactor到Model中。

    仿照Rails实战:购物网站 教材:5-6 step5:计算总价,做出在nav上显示购物车内product的数量. 遇到的❌: 1. <% sum = 0 %> <% current ...

  10. 2017年12月16日 ASP.NET基本用法

    ASP.NET初级添加 利用css代码跟ASP.NET还有Javascript原生,LinQ来写增跟展示数据 首先介绍一个非常好用的控件,灵活并且循环展示数据库里面的数据 <asp:Repeat ...

随机推荐

  1. 【项目】AtCoder for Chinese

    前排提示:Github 内容搭配梯子食用效果更佳( 项目地址 网页 插件安装 Join us or Give us a star ! 注:因内容迁移,下列链接暂时失效(用空再搬一遍)qwq Trans ...

  2. vim-瞬间移动打发

    一,常用基本命令 set rnu 显示相对行号 1.ctrl+F 将屏幕向下滚动一屏 2.ctrl+u pageUp,ctrl+d pageDown 3.行内移动:W,b在单词间移动,ge向上跳,f ...

  3. ubuntu undefined reference to

    温馨提示,请使用ctrl+F进行快速查找 libdl.so undefined reference to `dlsym' undefined reference to `dlopen' undefin ...

  4. X活手环的表盘自定义修改

    文章用到的所有工具及软件成品 前言 前几天我在某宝买了一个智能手环,无奈软件中的表盘太少,所有我想着修改一下app中的资源文件. 反编译APK 这里反编译APK用apktool工具就可以. apkto ...

  5. Vue2组件间通讯

    Vue2组件通信的基础方式 自己的理解:组件化通信,无非就是数据你传我,我传你,两个组件的相互交流,方法很多,下方有图示(此篇建议小白阅读,大神的话也不会看,哈哈哈哈!仅供参考,有不同的意见可以一起交 ...

  6. Windows server 2008 tomcat间歇性掉线关闭

    1.代码没有问题,已经正常运行一年. 2.近期无更新代码. 3.tomcat 无运行报错. 今天突然间歇性掉线次数很多,客户不停反应情况,这边一时从代码开始找,我问了下在场运维其他服务器系统有无此现象 ...

  7. 网络I/O模型 解读

    网络.内核 网卡能「接收所有在网络上传输的信号」,但正常情况下只接受发送到该电脑的帧和广播帧,将其余的帧丢弃. 所以网络 I/O 其实是网络与服务端(电脑内存)之间的输入与输出 内核 查看内核版本 : ...

  8. 【Shell脚本案例】案例1:服务器系统配置初始化

    〇.目录 一.背景 新购买10台服务器,并安装Linux系统 目的:对操作系统进行配置的初始化 二.需求 1.设置时区并同步时间 2.禁用selinux安全机制 3.关闭防火墙(清空防火墙的默认策略, ...

  9. Relational Learning with Gated and Attentive Neighbor Aggregator for Few-Shot Knowledge Graph Completion 小样本关系学习论文解读

    小样本知识图补全--关系学习.利用三元组的邻域信息,提升模型的关系表示学习,来实现小样本的链接预测.主要应用的思想和模型包括:GAT.TransH.SLTM.Model-Agnostic Meta-L ...

  10. MySQL主从配置(Django实现主从配置读写分离)

    目录 一 MySQL主从配置原理(主从分离,主从同步) 二 操作步骤 2.1我们准备两台装好mysql的服务器(我在此用docker模拟了两台机器) 2.2 远程连接入主库和从库 远程连接主库 远程连 ...