###########基于双下划线的跨表查询(基于join实现的)#############
key: 正向查询按字段,反向查询按表名小写
1.查询python这本书出版社的名字
ret = Book.objects.filter(title="python").values("publish__name")
print(ret)
ret = Publish.objects.filter(book__title="python").values("name")
print(ret)
2 查询苹果出版社出版的所有的书籍的名称
ret = Publish.objects.filter(name="苹果出版社").values("book__title")
print(ret)
ret = Book.objects.filter(publish__name="苹果出版社").values("title")
print(ret)
3 查询python这本书籍的作者的年龄
ret = Book.objects.filter(title="python").values("authors__age")
print(ret)
ret = Author.objects.filter(book__title="python").values("age")
print(ret)
4 查询alex出版过的所有的书籍名称
ret = Author.objects.filter(name="alex").values("book__title")
print(ret)
ret = Book.objects.filter(authors__name="alex").values("title")
print(ret)
5 查询alex的手机号
ret = Author.objects.filter(name="alex").values("ad__tel")
print(ret)
ret = AuthorDetail.objects.filter(author__name="alex").values("tel")
print(ret)
6 查询手机号为123的作者的名字
ret = AuthorDetail.objects.filter(tel=123).values("author__name")
print(ret)
ret = Author.objects.filter(ad__tel=123).values("name")
print(ret)
########## 连续跨表 ###############
查询苹果出版社出版过的所有书籍的名字以及作者的姓名
ret = Publish.objects.filter(name="苹果出版社").values("book__title","book__authors__name")
print(ret)
ret = Book.objects.filter(publish__name="苹果出版社").values("title","authors__name")
print(ret)
手机号以123开头的作者出版过的所有书籍名称以及出版社名称
ret = AuthorDetail.objects.filter(tel__startswith=123).values("author__book__title","author__book__authors__name")
print(ret)
ret = Author.objects.filter(ad__tel__startswith=123).values("book__title","book__publish__name")
print(ret)
############### 聚合 分组 ################
查询所有书籍的平均价格
ret = Book.objects.aggregate(ang_price=Avg("price"))
print(ret)
查询所有书籍的个数
ret = Book.objects.aggregate(c=Count(1))
print(ret)
分组
单表分组查询
查询书籍表每一个出版社id以及对应的书籍个数
key: annotate()前values哪一个字段就按哪一个字段group by
ret = Book.objects.annotate(c=Count(1)).values("publish__nid","c")
print(ret)
查询每一个部门的名称以及对应员工的平均薪水
ret = Emp.objects.values("dep").annotate(avg_salary=Avg("salary"))
print(ret)
查询每一个省份的名称以及对应的员工最大年龄
ret = Emp.objects.values("pro").annotate(max_age=Max("age"))
print(ret)
###单表按主键分组没有意义
跨表分组查询
查询每一个出版社的名称以及对应的书籍平均价格
ret = Publish.objects.annotate(avg_price=Avg("book__price")).values("name","avg_price")
print(ret)
查询每一个作者的名字以及出版的书籍的最高价格
ret = Author.objects.annotate(max_price=Max("book__price")).values("name","max_price")
print(ret)
查询每一个书籍的名称以及对应的作者的个数
ret = Book.objects.annotate(c=Count("authors__pk")).values("title","c")
print(ret)
4 查询作者数不止一个的书籍名称以及作者个数
ret = Book.objects.annotate(c=Count("authors__pk")).filter(c__gt=1).values("title","c")
print(ret)
5 根据一本图书作者数量的多少对查询集 QuerySet进行排序
ret = Book.objects.annotate(c=Count("authors__pk")).order_by("c")
print(ret)
6 统计每一本以py开头的书籍的名称以及作者个数
ret = Book.objects.filter(title__startswith="py").annotate(c=Count("authors__pk")).values("title","c")
print(ret)
############### F 与 Q ################
查询评论数大于100的所有的书籍名称
ret = Book.objects.filter(comment_count__gt=100).values("title")
print(ret)
查询评论数大于2倍点赞数的所有的书籍名称
ret = Book.objects.filter(comment_count__gt=F("poll_count")*2)
print(ret)
给每一本书籍的价格提升100
Book.objects.update(price=F("price")+100)
查询价格大于300或者评论数大于3000的书籍
ret = Book.objects.filter(Q(price__gt=300)|Q(comment_count__gt=3000))
print(ret)

orm多表查询基于双下划线的更多相关文章

  1. Django day08 多表操作 (三) 基于对象的跨表查询 基于双下划线的多表查询

    一: 基于对象的跨表查询 1. 一对一 正向: 反向: 2. 一对多 正向: 反向: 3.多对多 正向: 反向: 4.*****基于对象的多表查询 二: 基于双下划线的多表查询 1. 连表查询 一对一 ...

  2. django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询

    from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...

  3. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

  4. (20)模型层 -ORM之msql 基于双下划线的跨表查询(一对一,一对多,多对多)

    基于对象的跨表查询是子查询 基于双下划线的查询是连表查询 PS:基于双下划线的跨表查询 正向按字段,反向按表名小写 一对一 需求:查询lqz这个人的地址# 正向查询ret = models.Autho ...

  5. Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询

    Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...

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

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

  7. django orm 基于双下划线的跨表查询

    一..基于双下划线的跨表查询(join实现) key:正向查询按字段,反向查询按表明小写 1.一对多跨表查询 查询在跨表中可以有两种方式,正向查询就是关键字段在你要搜索的表,没有关键字段就是反向查询 ...

  8. $Django 模板层(模板导入,继承)、 单表*详(增删改查,基于双下划线的查询)、static之静态文件配置

    0在python脚本中使用django环境 import osif __name__ == '__main__':    os.environ.setdefault("DJANGO_SETT ...

  9. python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)

    昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...

随机推荐

  1. JavaScript图形实例:图形的旋转变换

    旋转变换:图形上的各点绕一固定点沿圆周路径作转动称为旋转变换.可用旋转角表示旋转量的大小. 旋转变换通常约定以逆时针方向为正方向.最简单的旋转变换是以坐标原点(0,0)为旋转中心,这时,平面上一点P( ...

  2. numpy 数组集合运算及下标操作

    1. 数组的集合运算 1.1. 并集 np.union1d(a,b)计算数组的并集: In [1]: import numpy as np In [2]: a = np.array([1,2,3]) ...

  3. Variational Auto-encoder(VAE)变分自编码器-Pytorch

    import os import torch import torch.nn as nn import torch.nn.functional as F import torchvision from ...

  4. [转帖]是什么阻止了在18寸(450mm)晶圆上生产芯片?

    是什么阻止了在18寸(450mm)晶圆上生产芯片? https://news.cnblogs.com/n/644247/ 投递人 itwriter 发布于 2019-10-16 14:32 评论(0) ...

  5. Python3之字符串格式化format函数详解(下)

    格式限定符 format通过丰富的的“格式限定符”(语法是 {}中带:号)对需要格式的内容完成更加详细的制定. 进制转换 我们可以再限定符中制定不同的字符对数字进行进制转换的格式化,进制对应的表格: ...

  6. 【SoloPi】SoloPi使用1-初次使用,环境准备(Windows版)

    下载配置Android SDK路径前往 https://developer.android.com/studio/releases/platform-tools#downloads 下载对应系统版本的 ...

  7. 论坛中的问题:47(等待类型为MSSEARCH的进程被KILL之后,一直处于回滚状态)

    原文:论坛中的问题:47(等待类型为MSSEARCH的进程被KILL之后,一直处于回滚状态) 求助:等待类型为MSSEARCH的进程被KILL之后,一直处于回滚状态 http://bbs.csdn.n ...

  8. Flask无法访问(127.0.0.1:5000)的问题解决方法

    Flask默认开启的ip地址是:http://127.0.0.1:5000/ 但在运行时可能存在无法访问的问题,特别是当我们在linux服务器上搭建flask时,此时需要将代码修改如下: app.ru ...

  9. 定时任务cron表达式详解

    参考自:https://blog.csdn.net/fanrenxiang/article/details/80361582 一 cron表达式 顺序 秒 分 时 日期 月份 星期 年(可选) 取值 ...

  10. 关于Vue-ElementUI修改默认样式不成功问题解决

    Element是一个很好用的组件库,但是有时候我们需要修改一些组件的样式以满足我们自己的需求. 我们用浏览器调试找到相应的class,在本地重写这个class时,发现修改不成功. 这是因为在Vue文件 ...