# --------------------------------------------------------------------------------------------------------
# 三张表 出版社表 书籍表 作者表
#
# # 书籍表
# class Book(models.Model):
# name = models.CharField(max_length=20)
# price = models.IntegerField()
# pub_date = models.DateField()
# publish = models.ForeignKey("Publish")
# #authors = models.ManyToManyField("Author") #一般创建多对多关系 自己也可以创建一个多对多表关系 推荐单建立一个多表
#   # authors 对应Author的id == authors_id authors.列名 能取到Author的数据
# def __str__(self):
# return self.name
#
# class Meta:
# db_table = "Book"
# # 出版社表
# class Publish(models.Model):
# name = models.CharField(max_length=32)
# city = models.CharField(max_length=32)
#
# def __str__(self):
# return self.name
#
# class Meta:
# db_table = "Publish"
# # 推荐自己创建一个多表 这种比较灵活
# # class Book_Author(models.Model):
# # book=models.ForeignKey("Book")
# # author=models.ForeignKey("Author")
# # 作者表
# class Author(models.Model):
# name = models.CharField(max_length=32)
# age = models.IntegerField(default=20)
#
# def __str__(self):
# return self.name
#
# class Meta:
# db_table = "Author"
# -------------------------------------------------------------------------------------------------------- # --------------------------------------------------------------------------------------------------------
# 多表关系 一对多操作
# 添加数据
# Book.objects.create(name="python", price=77, pub_date="2017-12-12", publish_id=2)
#
# publish_obj=Publish.objects.filter(name="人民出版社")[0]
# Book.objects.create(name="GO",price=23,pub_date="2017-05-12",publish=publish_obj) # book_obj=Book.objects.get(name="python") # 是一个对象
# print(type(book_obj))
# print(book_obj.name)
# print(book_obj.pub_date)
#
# #一对多:book_obj.publish--------一定是一个对象
# print(book_obj.publish.name)
# print(book_obj.publish.city)
# print(type(book_obj.publish))
#
# 查询人民出版社出过的所有书籍名字和价格
# select name,price from Book where publish_id in (select id from Publish where name="人民出版社");
# 方式一:
# pub_obj = Publish.objects.filter(name="人民出版社")[0]
# ret = Book.objects.filter(publish=pub_obj).values("name", "price")
# print(ret) # 方式二
# pub_obj = Publish.objects.filter(name="人民出版社")[0]
# print(pub_obj.book_set.all().values("name","price"))
# print(type(pub_obj.book_set.all())) # 方式三 推荐用这个 正向查询 神奇的双下划线 __
# 通过 filter values (双下换线)进行多对多的关联查询(形式和一对多)
#
# 查询人民出版社出的书名 和 书的价格
# SELECT `Book`.`name`, `Book`.`price` FROM `Book` INNER JOIN `Publish` ON (`Book`.`publish_id` = `Publish`.`id`) WHERE `Publish`.`name` = '人民出版社'
# ret=Book.objects.filter(publish__name="人民出版社").values("name","price")
# print(ret)
#
# python这本书出版社的名字 注意book要小写
# select name from Publish where id in (select publish_id from Book where name="python");
# SELECT `Publish`.`name` FROM `Publish` INNER JOIN `Book` ON (`Publish`.`id` = `Book`.`publish_id`) WHERE `Book`.`name` = 'python'
# ret2 = Publish.objects.filter(book__name="python").values("name")
# print(ret2)
# ret3 = Book.objects.filter(name="python").values("publish__name")
# print(ret3)
#
# 北京城市出的所有书
# select name from Book where publish_id in (select id from Publish where city="bj")
# SELECT `Book`.`name` FROM `Book` INNER JOIN `Publish` ON (`Book`.`publish_id` = `Publish`.`id`) WHERE `Publish`.`city` = 'bj'
# ret4 = Book.objects.filter(publish__city="bj").values("name")
# print(ret4) # 查询一段时间内出过书的出版社
# SELECT `Publish`.`name` FROM `Book` INNER JOIN `Publish` ON (`Book`.`publish_id` = `Publish`.`id`) WHERE (`Book`.`pub_date` < '2017-07-01' AND `Book`.`pub_date` > '2017-01-01')
# ret5=Book.objects.filter(pub_date__lt="2017-07-01",pub_date__gt="2017-01-01").values("publish__name")
# print(ret5)
# -------------------------------------------------------------------------------------------------------- # --------------------------------------------------------------------------------------------------------
# 多多关系 对对多操作
# 通过对象的方式绑定关系
# book_obj=Book.objects.get(id=3)
# print(book_obj.authors.all())
# print(type(book_obj.authors.all())) #查询id为2的作者出的书
# author_obj=Author.objects.get(id=2)
# print(author_obj.book_set.all()) # 多表操作 增加数据
# book_obj=Book.objects.get(id=37)
# author_objs=Author.objects.all()
# book_obj.authors.add(*author_objs) # 多表操作 删除数据
# # book_obj.authors.remove(*author_objs)
# book_obj.authors.remove(4) # 创建第三张表
# Book_Author.objects.create(book_id=38,author_id=1)
# Book_Author.objects.create(book_id=35,author_id=1)
# Book_Author.objects.create(book_id=37,author_id=1) # 查找book id是36的作者
# select name from Author where id in (select author_id from Book_Author where book_id = 35);
# ret = Author.objects.filter(book_author__book__id="35")
# obj_id = Book.objects.filter()
# print(ret)    # 外键找外键关联的表 直接用fk找
# 没外键找和它有关联表用 外键的类_set找 注意 外键类小写 或者在外键上加上 related_name='自己的类名' 注意小写
ret = Book.objects.get(id=36).authors.all().values("name")
print(ret) # zhangsan出过的书籍名称及价格
# select name,price from Book where id in (select book_id from Book_Author where author_id in(select id from Author where name="zhangsan")));
# ret2=Book.objects.filter(book_author__author__name="zhangsan").values("name","price")
# ret2=Book.objects.filter(authors__name="zhangsan").values("name","price")
# print(ret2)
# ret1 = Author.objects.get(name="zhangsan").book_set.values("name","price")
ret1 = Author.objects.get(name="zhangsan").book_set.all()
print(ret1) # 找出 linux运维 这本书的作者是谁
#SELECT `Author`.`name` FROM `Author` INNER JOIN `Book_Author` ON (`Author`.`id` = `Book_Author`.`author_id`) INNER JOIN `Book` ON (`Book_Author`.`book_id` = `Book`.`id`) WHERE `Book`.`name` = 'linux运维';
#select name from Author where id in (select author_id from Book_Author where book_id in (select id from Book where name = "linux运维"));;
# ret = Author.objects.filter(book_author__book__name="linux运维").values("name")
ret2 = Book.objects.get(name="linux运维").authors.all().values("name")
print(ret2) # 聚合函数 aggregate
# ret=Book.objects.all().aggregate(Avg("price"))
# ret=Book.objects.all().aggregate(Sum("price"))
# ret=Book.objects.filter(authors__name="alex").aggregate(alex_money=Sum("price"))
# ret=Book.objects.filter(authors__name="alex").aggregate(Count("price"))
# print(ret) # ret=Book.objects.values("authors__name").annotate(Sum("price"))
# print(ret) # ret=Publish.objects.values("name").annotate(abc=Min("book__price"))
# print(ret) # b=Book.objects.get(name="GO",price=77)
# print(b) # Book.objects.all().update(price=F("price")+10) # ret=Book.objects.filter(Q(name__contains="G"))
# print(ret) # ret=Book.objects.filter(Q(name="GO"),price=87)
# print(ret) # ret=Book.objects.filter(price=200) # for i in ret:
# print(i.price)
#
# Book.objects.all().update(price=200)
# ret = Book.objects.filter(price=100)
# for i in ret:
# print(i.price) # if ret.exists():
# print("ok") # ret=ret.iterator()
# print(ret)
#
# for i in ret:
# print(i.name)
#
# for i in ret:
# print(i.name)

Django 多表查询 聚合查询 分组查询 F查询 Q查询的更多相关文章

  1. Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)

    Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...

  2. Django模型系统——ORM中跨表、聚合、分组、F、Q

    核心知识点: 1.明白表之间的关系 2.根据关联字段确定正反向,选择一种方式 在Django的ORM种,查询既可以通过查询的方向分为正向查询和反向查询,也可以通过不同的对象分为对象查询和Queryse ...

  3. Django ORM 之F、Q查询与事务

    返回ORM目录 Django ORM 内容目录 一.F.Q查询 二.事务 三.only与defer 一.F.Q查询 """ Product表中的数据: 1 橡皮 2 20 ...

  4. Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作

    Django orm进阶查询(聚合.分组.F查询.Q查询).常见字段.查询优化及事务操作 聚合查询 记住用到关键字aggregate然后还有几个常用的聚合函数就好了 from django.db.mo ...

  5. Django 聚合查询 分组查询 F与Q查询

    一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...

  6. Django 聚合分组F与Q查询及choices

    一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...

  7. Django中多表的增删改查操作及聚合查询、F、Q查询

    一.创建表 创建四个表:书籍,出版社,作者,作者详细信息 四个表之间关系:书籍和作者多对多,作者和作者详细信息一对一,出版社和书籍一对多 创建一对一的关系:OneToOne("要绑定关系的表 ...

  8. django----聚合查询 分组 F与Q查询 字段 及其 参数

    目录 一.orm补充查询 聚合查询 1-1 分组查询 1-2 F与Q查询 1-3 二. 字段及其参数 常用字段 AutoField IntegerField CharField DateField D ...

  9. django基础之day05,F与Q查询,Q查询的高级用法

    #F与Q查询 #*************************** F 查询 ******************** # F 查询数据库中的其他字段!!! #1.查询库存数大于卖出数的书籍 fr ...

  10. django F与Q查询 事务 only与defer

    F与Q 查询 class Product(models.Model): name = models.CharField(max_length=32) #都是类实例化出来的对象 price = mode ...

随机推荐

  1. Ubuntu之tar与curl操作

    1,压缩备份: tar cfvj /tmp/test.tar.bz2  /tmp/test tar cfvz /tmp/test.tar.gz  /tmp/test tar xfvj /tmp/tes ...

  2. 【Java并发编程】:并发新特性—塞队列和阻塞栈

    阻塞队列 阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是Java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue.Delay ...

  3. Windows Server2016服务器系统创建域服务器

    原先是有图片,因为图片是直接粘贴上来的,发布之后图片都看见了,然后都使用上传图片的方式才搞定,这也是博客园比较坑的地方: 也可以查看该链接含图片: http://www.cnblogs.com/all ...

  4. java 算法 - 冒泡排序

    冒泡排序: 冒泡排序是专门针对已有的一部分已经排序的数据进行排序的一种排序算法.假如你的数据中只有两个数据输乱序的,那么冒泡排序就是最快的.这种算法的核心思想就是扫描数据清单,找到乱序中相邻的两个数据 ...

  5. 17-hadoop-yarn安装

    在搭建好的 resourceHA的环境下, 配置yarn yarn是 hadoop2以后的计算框架, 通过ResourceManager的调用, 将我们写的程序包分到各个nodeManager上, 由 ...

  6. Nodejs学习笔记(十)—与MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门

    简介 MongoDB 开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序:高伸缩性: NoSQL毕竟还处于发展阶段,也有说它的各种问题的:http://coolshel ...

  7. C# 抓取网页内容的方法

    1.抓取一般内容 需要三个类:WebRequest.WebResponse.StreamReader 所需命名空间:System.Net.System.IO 核心代码: view plaincopy ...

  8. sql中替换换行符和空格的示例

    select DiscussID,L.Name as LocationName , C.Name as ClientName, REPLACE(BrandName,' ','') BrandName ...

  9. Web服务的调用

    1.创建服务引用 例如:天气预报 2.在代码添加引用空间 TvProgram.ChinaTVprogramWebService tp = new TvProgram.ChinaTVprogramWeb ...

  10. Eureka Server项目启动报错处理

    Eureka Server项目启动报错处理 Eureka是一个服务发现组件,提供服务注册.发现等注册中心功能,使用spring boot启动eureka应用时出现报错: 20:36:17.646 [r ...