# --------------------------------------------------------------------------------------------------------
# 三张表 出版社表 书籍表 作者表
#
# # 书籍表
# 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. Spring Security构建Rest服务-0500-异步处理rest服务

    异步处理REST服务: 1,使用Runnable异步处理Rest服务 2,使用DeferredResult异步处理Rest服务 3,异步处理配置 异步处理能提高服务器的吞吐量. 一.使用Runnabl ...

  2. 搭建互联网架构学习--003--maven以及nexus私服搭建

    跳过,等待完善中,,, 后台服务工具maven:使用Nexus配置Maven私有仓库 一.安装配置Nexus 1. 下载nexus https://www.sonatype.com/download- ...

  3. 【Java并发编程】:加锁和volatile变量

    加锁和volatile变量两者之间的区别: 1.volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比syn ...

  4. ES6 箭头函数(Arrow Functions)

    ES6 箭头函数(Arrow Functions) ES6 可以使用 "箭头"(=>)定义函数,注意是函数,不要使用这种方式定义类(构造器). 一.语法 具有一个参数的简单函 ...

  5. C/C++ -- Gui编程 -- Qt库的使用 -- 理解主窗体构造函数

    MyWidget做父窗体 MyWidget的构造函数中可以手动添加组件 Ui::MyWidget存放子部件 Ui::MyWidget执行setupUi()函数为子部件开辟空间,指定父窗体 MyWidg ...

  6. C/C++ -- Gui编程 -- Qt库的使用 -- 构造函数中添加组件

    在构造函数中定义一个标签,设置自动换行和样式表 -----mywidget.cpp----- #include "mywidget.h" #include "ui_myw ...

  7. 数据库报错com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'ua' at row 1

    记一次报错记录,成长路上的点滴 明明使用浏览器或者微信开发工具调试接口没有问题,但是在真机测试时候就出问题了.(((¬_¬)) 500服务器内部错误,要死的节奏啊 登陆tomcat服务器 使用命令ta ...

  8. php的304方式

    一般浏览器请求php是不会被缓存的,除非php直接显示的发送head 304 if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { $browserCache ...

  9. spring中获取applicationContext(2)

    前几天写web项目的时候,用到了spring mvc. 但是又写bean.我要在代码里面生成,而这个bean里面,又有一些属性是通过spring注入的. 所以,只能通过ApplicationConte ...

  10. SpringMvc注解开发

    1.四大注解的定义 (1)Controller注解:该注解使用在一个类上面,参数为value,值为访问该controller的名称,默认为空,如果为空 则值为该controller类名的首字母小写的值 ...