说明我们在设计SQL语句的时候,将表仔细创建,这里很重要,后期就最好不要动了

设计表,将各个表之间的对应关系梳理清楚,这是对表查询的重要的步骤

多表操作

一对一:

增删改查
​   model.Author.objects.create(name='二哥',age=59,ad_id=1)
删除
​   model.Author.objects.filter(id=1).delete()
改
​   model.Author.objects.filter(id=1).update(name='2ge2')
查
​   正向:
​       model.Author.objects.filter(id=1)[0].ad.telephone
​   反向
​       ad_obj =   model.AuthorDetail.objects.filter(telephone=111)[0]
​       ad_obj.author.id

一对多:

增加:
​       model.Book.objects.create(title='xx',price=12,publish_id=1)
​       model.Book.objects.create(title='xx',price=12,publish=publish的model对象)
​   删除
​       model.Book.objects.filter(id=3)[0].delete()
​       model.Book.objects.filter(id=3).delete()
​   修改:
​       model.Book.objects.filter(id=3).update(title='xxx',publish_id=2)
​   查询
​       反向查询:红浪漫出版社出版过哪些书籍(只要名称)
​           pub_obj = model.Publish.objects.filter(name='红浪漫出版社').first()
​           pub_obj. book_set.all().value()    .value_list()
​            .filter(xxx=xxx)  author_obj = models.Author.objects.get(name='二哥')print(author_obj.book_set.all().values('title').filter(title='linux')) #  <QuerySet [{'title': 'linux'}, {'title': 'linux'}]>
​       正向查询:
​           book_obj = models.Book.objects.filter(title='jinpinmei').first()
​            book_obj .publish.name

多对多的

增加

    book_obj = models.Book.objects.create(title='水浒',price=11,publish_id=1)authorerge = models.Author.objects.get(name='二哥')authorsange = models.Author.objects.get(name='三哥')book_obj.authors.add(*[authorerge,authorsange])book_obj.authors.add(*[authorerge.id,authorsange.id])

删除

    book_obj.authors.remove(authorerge)book_obj.authors.remove(1)book_obj.authors.remove(1,2,3)book_obj.authors.remove(*[1,2,3])book_obj.authors.clear()book_obj.authors.set(['1','2',])

查询:

正向查询:

   book_obj = models.Book.objects.get(title='水浒')book_obj.authors.all().values('name'),.values_list('name')book_obj.authors.filter()

反向查询

 authorsange = models.Author.objects.get(name='三哥')authorsange.book_set.all().values('title')

基于双下划线的查询

一对一查一下雄哥的手机号
models.Author.objects.filter(name='雄哥').values('ad__telephone')
models.AuthorDetail.objects.filter(author__name='雄哥').values('telephone')一对多红浪漫出版了哪些书
models.Publish.objects.filter(name='红浪漫出版社').values('book__title')
models.Book.objects.fitler(publishs__name='红浪漫出版社').values('title')多对多python这本书是哪些作者写的
models.Book.objects.filter(title='python').values('authors__name')
models.Author.objects.filter(book__title='python').values('name')

聚合

查询一下所有书的平均价格
from django.db.models import Avg,Max,Min,Count,Sum
models.Book.objects.all().aggregate(a=Avg('price')) #结果是个字典

分组

查询作者出版过的书的平均价格
models.Author.objects.values('name').annotate(a=Avg('book__price'))#这里annotate是分组,以name分组
#annotate只能以前面的values作为分组条件,如果没有则以第一个表的ID分组models.Book.objects.values('authors__name').annotate(a=Avg('price'))

F

   在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?我们在book表里面加上两个字段:评论数:commentNum,收藏数:KeepNumDjango 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。我先查看点赞数小于评论数的所有书籍
from django.db.models import F
model.Book.objects.filter(zan__lt=F('comment'))
统一给价格加100块
model.Book.objects.all().update(price=F('price')+100)

Q

filter() 等方法中的关键字参数查询都是一起进行“AND” 的。 如果你需要执行更复杂的查询(例如OR 语句),你可以使用Q 对象。Q 对象可以使用&(与) 、|(或)、~(非) 操作符组合起来。当一个操作符在两个Q 对象上使用时,它产生一个新的Q 对象。查询2019年的点赞数小于100的,或者评论小于100的书籍名称和价格
models.Book.objects.filter(Q(zan__lt=100)|Q(comment__lt=100),date__year=2019).values('title','price')
#1 查询每个作者的姓名以及出版的书的最高价格
ret = models.Author.objects.annotate(m=Max('book__price')).values('name','m')
#这里annotate是分组,以Author表中的ID分组,其中values省略了
#annotate只能以前面的values作为分组条件
#ret 获取到的值是annotate里面的m值和id的值,如果想要更多则在后面添加values写自己需要的值ret = models.Book.objects.values('authors__name').annotate(m=Max('price'))
print(ret)#2 查询作者id大于2作者的姓名以及出版的书的最高价格
models.Author.objects.filter(id__gt=2).annotate(m=Max('book__price')).values('name','m')#3 查询作者id大于2或者作者年龄大于等于20岁的,女作者的姓名以及出版的书的最高价格
models.Author.objects.filter(Q(sex='女')&Q(Q(id__gt=2)|Q(age__gte=20))).values('name').annotate(m=Max('book__price'))
#4 查询每个作者出版的书的最高价格 的平均值
models.Author.objects.values('id').annotate(a=Max('book__price')).aggregate(m=Avg('a'))
#5 每个作者出版的所有书的最高价格的那本书的名称
models.Author.objects.values('name').annotate(a=Max('book__price')).values('book__title')

django 框架 SQL 语句 查询篇相关推荐

  1. EF框架-SQL语句 查询与修改

    机房合作当中使用到了框架首先有很多的不同之处,大大方便的编程的时间. 首先在查询与修改这两个点出发. 查询 这是使用SQL语句进行的查询,查询到的是多条信息 public List<Cancel ...

  2. ORACLE基本SQL语句-查询篇

    一.普通查询 /*查询表数据*/ select * from STU /*取出前3行数据*/ select * from stu where ROWNUM<=3 /*模糊查询*/ select ...

  3. thinkphp5基本的一些操作/API友好/获取请求信息(Request)/判断请求类型(GET...)/验证参数数据(Validate)/连接数据库/原生sql语句查询

    文章目录 一.API友好 1.举两个thinkphp5关于API友好的例子 (1)数据输出 (2)错误调试Trace 二.获取请求信息(Request) 1.获取URL信息 2.获取 模块/控制器/操 ...

  4. mysql hql查询语句_使用Query进行HQL语句查询和SQL语句查询

    HQL的语法比较简单,与普通SQL的区别之处是针对对象的不同,在查询语句中将sql中的表名替换成了sql中的持久化类名,因为hibernate机制是基于对象进行查询的. 不带参数的查询,语句是&quo ...

  5. Sql语句查询 显示序号

    怎么样用SQL语句查询出来带有序号,不是我们用递增所带的ID号 就是按行数用数字显示出来 序号,id,userid 1 5 aaa 2 6 bbb 3 8 ccc 4 9 ddd 5 17 eee 类 ...

  6. sql语句查询过慢的原因分析

    有时候你在使用sql语句查询数据库,sql语句写得好正确,但则发现执行查询的时候很慢呢?数据量也不是太大,你知道其中的原因吗?本文给大家讲解一下sql查询过慢的48种原因分析,请阅读. 1.没有索引或 ...

  7. 一条SQL语句查询数据库中的所有表、存储过程、触发器

    一条SQL语句查询数据库中的所有表.存储过程.触发器 (sysobjects表信息)   该条语句查询返回所有的用户表 select * from sysobjects where xtype='u' ...

  8. 案例:用一条 SQL 语句查询出每门课都大于 80 分的学生姓名

    用一条sql语句查询出每门课都大于80分的学生姓名 首先需要进行分析: 要查询出每门课程都大于80分的学生姓名,因为一个学生有多门课程,所以会出现下面三种情况. 第一可能所有课程都大于80分. 第二可 ...

  9. 如何用SQL语句查询Excel数据

    Q:如何用SQL语句查询Excel数据? A:下列语句可在SQL SERVER中查询Excel工作表中的数据. 2007和2010版本: SELECT *  FROM OpenDataSource(  ...

  10. oracle图书操作、sql语句查询+授权、视图、索引、表操作

    oracle图书操作.sql语句查询+授权.视图.索引.表操作 一.创建一张表book,表结构为(总编号,分类号,书名,作者,出版单位,单价),插入若干记录 二.创建一张表reader,表结构为(借书 ...

最新文章

  1. EOS账户和钱包综合指南
  2. 利用正则表达式去除所有html标签,只保留文字
  3. docker 查看已安装容器_docker中的容器安装PHP扩展件
  4. 找出一堆数中最小的前K个数
  5. 序列密码体制——密码学笔记(三)
  6. 详解JavaScript之神奇的Object.defineProperty
  7. python安装库后无法调用摄像头_银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令...
  8. 人工神经网络——【BP】反向传播算法证明
  9. 计算机网络第6章(应用层)
  10. 都说Python库千千万,这几个你认识不?
  11. mysql range代表什么意思_MySQL数据表range分区例子
  12. app能不能跳转外部h5_轻羽微信小程序和H5的区别在哪里?主要有三点
  13. 等长子网划分、变长子网划分(网络整理)
  14. go语言json嵌套数组结构体用法
  15. java char a z_java中,char A,char a的值各是多少?
  16. USACO-Section3.2 Feed Ratios【克莱默法则】
  17. 阿里P8级大佬详解并发编程里的设计模式之Guarded Suspension
  18. jzojNOIP2014模拟 8.14总结
  19. 2014年实习生招聘之武汉光庭信息技术有限公司实习生招聘部分笔试题(Java)—2014/04/14
  20. 【Paper】毕业论文免费查重网站平台汇总

热门文章

  1. SSL基础:13:X.509证书格式介绍
  2. Cinnamon 任务栏网速绘制内存和CPU使用率竖线
  3. 从巨噬细胞macrophage_clean先去 除线粒体再提取AM1 AM2 AM3
  4. java中set,get用法
  5. 使用环绕通知对目标方法进行增强—摘抄笔记
  6. 盘姬工具箱v1.10最新版 非常实用的工具箱软件
  7. 【jzoj2173】【DFS】无根树
  8. linux里hba状态_Linux下查看FC HBA信息
  9. 如何打开.DAT格式的测风数据?
  10. Microsoft Sync Framework Runtime 简介(一篇非常好的MSF介绍文章)