1. #######多表操作二########
  2.  
  3. 昨天写了基于双下划线查找,都是两个表之间查找,那再多跨几个表呢?还是一样,一步一步分析
  4.  
  5. # 跨多表查询:
  6. 查询红楼梦这本书的作者的电话:
  7. (Author,Book,Authorinfo三张表对吧)
  8. Book作为基表:
  9. ret = models.Book.objects.filter(name='红楼梦').values('author__authorinfo__phone')
  10. Author作为基表
  11. ret = models.Author.objects.filter(book__name='红楼梦').values('authorinfo__phone')
  12. Authorinfo作为基表:
  13. ret = models.Authorinfo.objects.filter(author__book__name='红楼梦').values('phone')
  14.  
  15. # 上面三种方式查询出来的结果的都是一样,方法也是一样,我拿第一句为例来说。
  16. # 首先看要求已知什么,就红楼梦这本书对吧,那我们的筛选条件的书名为红楼梦对吧,
  17. # 以谁为基表都可以,我以Book作为基表,Book下面是不是就有书名(name),所以我们可以之间通过name='红楼梦'可以找到那本书
  18. # 继续看要求,要我们查询的作者的电话,这个作者电话再Authorinfo表中,而这个只和Author表有关系,
  19. # 那我们怎么通过Book表去找到Author表,Book表下面是不是有author字段(多对多的关系),所以正向查找按字段,找到Author表,
  20. # Author表下面也有authorinfo字段,继续正向查找,就能找到phone字段,所以author__authorinfo__phone,就能找到。
  21.  
  22. # 自己琢磨以Author、Authorinfo做基表查找
  23.  
  24. 查询重庆出版社出版的的书籍它所有作者的手机号:
  25. (Author,Book,Authorinfo,Publish四张表对吧)
  26. Author作为基表:
  27. ret = models.Author.objects.filter(book__publish__name='重庆出版社').values('authorinfo__phone')
  28. Book作为基表:
  29. ret = models.Book.objects.filter(publish__name='重庆出版社').values('author__authorinfo__phone')
  30. Authorinfo作为基表:
  31. ret = models.Authorinfo.objects.filter(author__book__publish__name='重庆出版社').values('name')
  32. Publish作为基表:
  33. ret = models.Publish.objects.filter(name='重庆出版社').values('book__author__authorinfo__phone')
  34.  
  35. 查询重庆出版社出版的的书籍它所有作者的名字和手机号码:
  36. 不写了,看到这文章的人,自己写写吧,我上面的代码values只传了一个参数,他可以传多个(提醒你了)
  37. 上一篇多表操作有我建立的models,关系都在上面,没有改动
  38.  
  39. 继续写聚合查询,这个和mysql里面的聚合函数一样。
  40. 首先是要导入的方法的
  41. from django.db.models import Svg,Max,Min,Sum
  42.  
  43. # 查询重庆出版社出版的书籍中,价钱最高,价钱最低,平均价钱,总价钱
  44. ret = models.Publish.objects.filter(name='北京出版社').aggregate(Max('book__price'),Min('book__price'),Avg('book__price'),Sum('book__price'))
  45.  
  46. # 查询所有书籍价钱最大的
  47. ret = models.Book.objects.all().aggregate(max=Max('price'))
  48. ret1 = models.Book.objects.all().aggregate(Max('price'))
  49. print(ret)
  50. print(ret1)
  51. 下面是依次的打印结果:
  52. {'max': Decimal('99.99')}
  53. {'price__max': Decimal('99.99')}
  54.  
  55. # 我想说的是,我们可以指定返回值的key值,不指定的话会默认以参数__方法名命名
  56. # 调用aggregate这个方法之后,它的返回值就是一个字典了,不再是queryset对象,就不能再用它的方法了。
  57.  
  58. 分组查询,也是就mysql中的group by
  59. from django.db.models import Svg,Max,Min,Sum,Count
  60. # 统计每一本书作者个数
  61. ret = models.Book.objects.all().annotate(count=Count('author'))
  62. for i in ret:
  63. print('书名:{}--作者个数:{}'.format(i.name,i.count))
  64.  
  65. # 统计每一个出版社的最便宜的书
  66. ret = models.Publish.objects.all().annotate(min=Min('book__price')).values('Book__name','min')
  67. print(ret)
  68.  
  69. # 统计每一本以西开头的书籍的作者个数:
  70. ret = models.Book.objects.all().filter(name__startswith='红').annotate(count=Count('author')).values('name','count')
  71. print(ret)
  72.  
  73. # 统计不止一个作者的图书:(作者数量大于一)
  74. ret = models.Book.objects.all().annotate(c=Count('author')).filter(c__gt=1).values('name','c')
  75. print(ret)
  76.  
  77. # 首先调用annotate方法它的返回值是一个queryset对象
  78.  
  79. 说说F查询:
  80. from django.db.models import F
  81. 先让我去models文件中Book表中加几个字段,并在数据库中随便加点数据
  82. comments_num = models.IntegerField(default=0)
  83. # 这本书评论数
  84. read_num = models.IntegerField(default=0)
  85. # 这本书的阅读数
  86.  
  87. # 查看所有书中,评论数大于阅读数的书名
  88. ret = models.Book.objects.all().filter(comments_num__gt=F('read_num')).values('name')
  89. print(ret)
  90.  
  91. # 让所有的书,阅读数+55
  92. models.Book.objects.all().update(read_num=F('read_num')+55)
  93.  
  94. # F的用法就是,比如评论数大于阅读数,comments_num__gt=read_num,这样写是不对的,等号右边必须是个值
  95. # 你放一个字段名是不对,我们可以通过F,将字段名给包裹起来,就写达到我们想要的效果。
  96. # F一般用在两个字段向比较的时候,等号右边那个字段。
  97.  
  98. 最后就是Q查询。
  99. Q这是一个类,一般用于逻辑处理

django-多表操作2的更多相关文章

  1. Django单表操作

    一.数据库相关设置 配置ORM的loggers日志: # 配置ORM的loggers日志 LOGGING = { 'version': 1, 'disable_existing_loggers': F ...

  2. Django多表操作

    多表创建 创建模型 下面通过一个简单的图书管理系统,来阐述多表的创建和查询操作 在视图函数里里定义如下代码 from django.db import models class Book(models ...

  3. django单表操作,增、删、改、查

    一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...

  4. django单表操作 增 删 改 查

    一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...

  5. Django分表操作、聚合及FQ方法

    聚合 aggregate(*args, **kwargs) # 计算所有图书的平均价格 from django.db.models import Avg Book.objects.all().aggr ...

  6. $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境

    在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTING ...

  7. Django models多表操作

    title: Django models多表操作 tags: Django --- 多表操作 单独创建第三张表的情况 推荐使用的是使用values/value_list,selet_related的方 ...

  8. python——Django(ORM连表操作)

    千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...

  9. python运维开发(十九)----Django后台表单验证、session、cookie、model操作

    内容目录: Django后台表单验证 CSRF加密传输 session.cookie model数据库操作 Django后台Form表单验证 Django中Form一般有2种功能: 1.用于做用户提交 ...

  10. Django ORM多表操作

    多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对 ...

随机推荐

  1. 2017年10月22日 基础SQL语句&数据库创建主外键关系

    1.SQL语句的注释 双减号:-- 或者/**/2.创建数据库create database 数据库名称(不允许以数字开头,不允许以符号开头,不要起汉语名字) 3.如何选中这个数据库use 数据库名 ...

  2. C# 矩阵运算和一些基本的几何运算

    以前工作中写的,这里备个份,有可能用到 基本的矩阵运算类,测试20阶以内应该没啥问题,超过20阶不好使... /// <summary> /// 矩阵 异常 512索引 1024无解 20 ...

  3. .NET开源工作流RoadFlow-表单设计-数据表格

    数据表格即在表单中显示一个table,该table数据可以来自任意自定义的来源: 数据类型:指定表格的数据源类型 1.datatable,即.net中的System.Data.DataTable 2. ...

  4. ArcGIS软件操作——地图制图

    ArcGIS软件操作系列二(地图制图) 2016年毕业,参加工作,除了平时出差,大部分时间都在使用ArcGIS处理数据.制图,在此,先将一些制图的小心得撰写出来,希望能与各位共同交流. 1 数据准备: ...

  5. 【起航计划ObjC 002】印第安老斑鸠ObjC的幻想 ---- Ubuntu下安装并使用MAC虚拟机

    本文介绍如何在Ubuntu下安装Mac OS X Mavericks系统.具体如下: 1)安装前准备工作 下载Mac OS X Mavericks系统,地址:http://pan.baidu.com/ ...

  6. PHP 运用rsa加密和解密实例

    1.加密解密的第一步是生成公钥.私钥对,私钥加密的内容能通过公钥解密(反过来亦可以) 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin ...

  7. Python tqdm show progress bar

    tqdm can help to show a smart progress bar, and it is very easy to use, just wrap any iterable with  ...

  8. 视频监控——从其他浏览器打开低版本IE方案

    1. 方案背景 由于低版本IE浏览器并不支持很多新的页面技术,导致部分页面效果难以实现;另一方面IE浏览器版本与操作系统绑定,难以统一,不同版本IE间的不兼容导致多种兼容性问题,因此本项目暂定采用Ch ...

  9. Selenium2学习(五)-- SeleniumBuilder辅助定位元素

    前言 福利来了,对于用火狐浏览器的小伙伴们,你还在为定位元素而烦恼嘛? 上古神器Selenium Builder来啦,哪里不会点哪里,妈妈再也不用担心我的定位元素问题啦!(但是也不是万能,基本上都能覆 ...

  10. numpy cheat sheet

    numpy cheat sheet https://files.cnblogs.com/files/lion-zheng/Numpy_Python_Cheat_Sheet.pdf