#######多表操作二########

昨天写了基于双下划线查找,都是两个表之间查找,那再多跨几个表呢?还是一样,一步一步分析

# 跨多表查询:
查询红楼梦这本书的作者的电话:
(Author,Book,Authorinfo三张表对吧)
Book作为基表:
ret = models.Book.objects.filter(name='红楼梦').values('author__authorinfo__phone')
Author作为基表
ret = models.Author.objects.filter(book__name='红楼梦').values('authorinfo__phone')
Authorinfo作为基表:
ret = models.Authorinfo.objects.filter(author__book__name='红楼梦').values('phone') # 上面三种方式查询出来的结果的都是一样,方法也是一样,我拿第一句为例来说。
# 首先看要求已知什么,就红楼梦这本书对吧,那我们的筛选条件的书名为红楼梦对吧,
# 以谁为基表都可以,我以Book作为基表,Book下面是不是就有书名(name),所以我们可以之间通过name='红楼梦'可以找到那本书
# 继续看要求,要我们查询的作者的电话,这个作者电话再Authorinfo表中,而这个只和Author表有关系,
# 那我们怎么通过Book表去找到Author表,Book表下面是不是有author字段(多对多的关系),所以正向查找按字段,找到Author表,
# Author表下面也有authorinfo字段,继续正向查找,就能找到phone字段,所以author__authorinfo__phone,就能找到。 # 自己琢磨以Author、Authorinfo做基表查找 查询重庆出版社出版的的书籍它所有作者的手机号:
(Author,Book,Authorinfo,Publish四张表对吧)
Author作为基表:
ret = models.Author.objects.filter(book__publish__name='重庆出版社').values('authorinfo__phone')
Book作为基表:
ret = models.Book.objects.filter(publish__name='重庆出版社').values('author__authorinfo__phone')
Authorinfo作为基表:
ret = models.Authorinfo.objects.filter(author__book__publish__name='重庆出版社').values('name')
Publish作为基表:
ret = models.Publish.objects.filter(name='重庆出版社').values('book__author__authorinfo__phone') 查询重庆出版社出版的的书籍它所有作者的名字和手机号码:
不写了,看到这文章的人,自己写写吧,我上面的代码values只传了一个参数,他可以传多个(提醒你了)
上一篇多表操作有我建立的models,关系都在上面,没有改动 继续写聚合查询,这个和mysql里面的聚合函数一样。
首先是要导入的方法的
from django.db.models import Svg,Max,Min,Sum # 查询重庆出版社出版的书籍中,价钱最高,价钱最低,平均价钱,总价钱
ret = models.Publish.objects.filter(name='北京出版社').aggregate(Max('book__price'),Min('book__price'),Avg('book__price'),Sum('book__price')) # 查询所有书籍价钱最大的
ret = models.Book.objects.all().aggregate(max=Max('price'))
ret1 = models.Book.objects.all().aggregate(Max('price'))
print(ret)
print(ret1)
下面是依次的打印结果:
{'max': Decimal('99.99')}
{'price__max': Decimal('99.99')} # 我想说的是,我们可以指定返回值的key值,不指定的话会默认以参数__方法名命名
# 调用aggregate这个方法之后,它的返回值就是一个字典了,不再是queryset对象,就不能再用它的方法了。 分组查询,也是就mysql中的group by
from django.db.models import Svg,Max,Min,Sum,Count
# 统计每一本书作者个数
ret = models.Book.objects.all().annotate(count=Count('author'))
for i in ret:
print('书名:{}--作者个数:{}'.format(i.name,i.count)) # 统计每一个出版社的最便宜的书
ret = models.Publish.objects.all().annotate(min=Min('book__price')).values('Book__name','min')
print(ret) # 统计每一本以西开头的书籍的作者个数:
ret = models.Book.objects.all().filter(name__startswith='红').annotate(count=Count('author')).values('name','count')
print(ret) # 统计不止一个作者的图书:(作者数量大于一)
ret = models.Book.objects.all().annotate(c=Count('author')).filter(c__gt=1).values('name','c')
print(ret) # 首先调用annotate方法它的返回值是一个queryset对象 说说F查询:
from django.db.models import F
先让我去models文件中Book表中加几个字段,并在数据库中随便加点数据
comments_num = models.IntegerField(default=0)
# 这本书评论数
read_num = models.IntegerField(default=0)
# 这本书的阅读数 # 查看所有书中,评论数大于阅读数的书名
ret = models.Book.objects.all().filter(comments_num__gt=F('read_num')).values('name')
print(ret) # 让所有的书,阅读数+55
models.Book.objects.all().update(read_num=F('read_num')+55) # F的用法就是,比如评论数大于阅读数,comments_num__gt=read_num,这样写是不对的,等号右边必须是个值
# 你放一个字段名是不对,我们可以通过F,将字段名给包裹起来,就写达到我们想要的效果。
# F一般用在两个字段向比较的时候,等号右边那个字段。 最后就是Q查询。
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. 错误 6 未能找到类型或命名空间名称“BLL”(是否缺少 using 指令或程序集引用?)

    出现这个错误,要确保先引用BLL.dll, 如果引用之后还没有解决这个问题的话,确认一下程序集FrameWork版本与项目FrameWork版本一致.右击程序集属性可以更改.

  2. 了解WaitForSingleObject中WAIT_ABANDONED 返回值

    1.互斥量内核对象 互斥量内核对象用来确保一个线程独占对一个资源的访问.互斥量对象包含一个使用计数.线程ID以及递归计数.互斥量与关键段的行为完全相同.但是互斥量是内核对象,而关键段是用户模式下的同步 ...

  3. SVN服务器在Ubuntu16.04下搭建多版本库详细教程

    1  介绍  Subversion是一个自由,开源的版本控制系统,这个版本库就像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况.这样就可 以很方面恢复到以前的版本,并可以查看数据 ...

  4. 类的方法练习——定义MySQL类

    要求: 1.对象有id.host.port三个属性 2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一 3.提供两种实例化方式,方式一:用户传入host和port 方式二: ...

  5. scss-@extend

    @extend指令用于共享规则和选择器之间的关系.它可以扩展所有其他类的样式在一个类中,也可应用于自己特定的样式. 查看如下scss@extend示例: .style{ font-size: 30px ...

  6. Android仿QQ界面

    最近这几天,一直跟着朋友们聚会什么的,没怎么做项目,今天总算是有时间开电脑继续做我的项目了.下面我就把我做的效果展示一下. 这是模仿了qq的界面效果.因为代码比较长就不粘贴代码了.需要的小伙伴可以跟我 ...

  7. clearfix为什么用display:table,而不用display:block

    我们都知道clearfix一般这么写: .clearfix:before,.clearfix:after{ content:""; display:table; } .clearf ...

  8. GitHub网页端和客户端操作

    参见GitHub上的repository中的moreLove.tata.tata2 moreLove 在网页版GitHub上创建的空项目然后填充的tata 在windows客户端创建的空项目然后填充的 ...

  9. javascript实现数据结构: 串的块链存储表示

    和线性表的链式存储结构相类似,也可采用链式方式存储串值.由于串结构的特殊性--结构中的每个数据元素是一个字符,则用链表存储串值时,存在一个“结点大小”的问题,即每个结点可以存放一个字符,也可以存放多个 ...

  10. Ubuntu16.04安装Docker1.12+开发实例+hello world+web应用容器

    本次主要是详细记录Docker1.12在Ubuntu16.04上的安装过程,创建Docker组(避免每次敲命令都需要sudo),Docker常用的基本命令的总结,在容器中运行Hello world,以 ...