1聚合查询aggregate

aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典,可以自己制定键。

1.# 计算所有图书的平均价格

  books = models.Book.objects.aggregate(Avg("price"))print(books)books = models.Book.objects.aggregate(a=Avg("price"))print(books)# {'price__avg': Decimal('130.000000')}# {'a': Decimal('130.000000')}

2.计算所有图书中的平均价格、最贵价格和最便宜的价格

books = models.Book.objects.aggregate(Avg("price"), Max("price"), Min("price"))print(books)# {'price__avg': Decimal('130.000000'), # 'price__max': Decimal('140.00'),# 'price__min': Decimal('110.00')}

2.分组查询annotate

# 查询每一个部门名称以及对应的员工数使用sql语句:select dep,count(*) from app01_emp group by dep;使用orm语句查询是:models.Emp.objects.values('dep').annotate(count('id'))
# 查询每一个部门名称以及对应的员工数count = models.Emp.objects.values('dep').annotate(c=Count('id'))# < QuerySet[{'dep': '销售部', 'c': 2},# {'dep': '关公部', 'c': 3}] >print(count)

# 查询每一个部门名称以及对应的员工的平均工资sql语句:select dep,avg(salary) from app01_emp group by dep;orm语句:models.Emp.objects.values('dep').annotate(avg(salary));
  # 查询每一个部门名称以及对应的员工的平均工资salary = models.Emp.objects.values('dep').annotate(Avg('salary'))print(salary)# <QuerySet [{'dep': '销售部', 'salary__avg': Decimal('8000.000000')},# {'dep': '关公部', 'salary__avg': Decimal('7333.333333')}]>salary = models.Emp.objects.values('dep').annotate(a=Avg('salary'))print(salary)# < QuerySet[{'dep': '销售部', 'a': Decimal('8000.000000')}, # {'dep': '关公部', 'a': Decimal('7333.333333')}] >

# 查询每一个部门名称以及对应的员工数SQL语句:分析:部门的名称是在dep表中联表select app01_dep.title,count(*) from app01_emps inner join app01_dep on app01_emps.dep_id=app01_dep.idgroup by app01_emps.dep_id;

orm语句:
# 查询每一个部门名称以及对应的员工数count = models.Emps.objects.values('dep__title').annotate(c=Count("id"))print(count)# <QuerySet [{'dep__title': '销售部', 'c': 2},# {'dep__title': '关公部', 'c': 3}]>

# 查询每一个部门名称以及对应的员工的平均工资

sql语句:

select app01_dep.title,avg(salary) from app01_emps inner join app01_dep on app01_emps.dep_id=app01_dep.idgroup by app01_emps.dep_id;

orm写法:# 写法1models.Emps.objects.values("dep_id").annotate(avg=Avg('salary'))
avg = models.Emps.objects.values("dep_id").annotate(avg=Avg('salary'))print(avg)# <QuerySet [{'dep_id': 1, 'avg': Decimal('9000.000000')},# {'dep_id': 2, 'avg': Decimal('7666.666667')}]>

写法2:(跨表)
models.Emps.objects.values("dep__title").annotate(a=Avg("salary"))
avg = models.Emps.objects.values("dep__title").annotate(avg=Avg('salary'))print(avg)# <QuerySet [{'dep__title': '销售部', 'avg': Decimal('9000.000000')}, # {'dep__title': '关公部', 'avg': Decimal('7666.666667')}]>

小结:在orm中如果2张表有关系的话,出现的values().annotate()即是在跨表分组

3.查询练习

1、练习:统计每一个出版社的最便宜的书的价格sql语句:select name,min(price) from app01_book inner joinapp01_publish on app01_book.publish_id=app01_publish.idgroup by app01_book.publish_id;

orm写法:models.Book.objects.annorate(min('price')).values("publish__name",'price')
# 1练习:统计每一个出版社的最便宜的书的价格msg = models.Publish.objects.values("name").annotate(min_price=Min("book__price"))# <QuerySet [{'name': '华山出版社', 'min_price': Decimal('110.00')}, # {'name': '明教出版社', 'min_price': None}]>

2、练习:统计每一本书的作者个数sql语句:select book_id,count(*) from app01_book_authors group by book_id

orm语句:
msg = models.Book.objects.annotate(num=Count('authors__name')).values('title', "num")print(msg)# <QuerySet [{'title': '独孤九剑', 'num': 2}, # {'title': '冲灵剑法', 'num': 1}, # {'title': '吸星大法', 'num':

3、练习:统计每一本以“九”开头的书籍的作者个数sql:语句select title, count(*) from app01_book inner join app01_book_authors on app01_book.id=app01_book_authors.book_idwhere app01_book.title like "独%" group by app01_book.id; 

orm写法:
msg = models.Book.objects.filter(title__startswith="独").annotate(num=Count('authors__name')).values('title', 'num')print(msg)# <QuerySet [{'title': '独孤九剑', 'num': 2}]>

 4、练习:统计不止一个作者的图书名称

sql语句:

select  title,count(*) from app01_book inner join app01_book_authors on app01_book.id=app01_book_authors.book_id group by book_id having count(*) > 1;

orm写法:

# 练习:统计不止一个作者的图书名称msg = models.Book.objects.annotate(num_author=Count("authors__name")).filter(num_author__gt=1).values('title', 'num_author')print(msg)# <QuerySet [{'title': '独孤九剑', 'num_author': 2}]>

 5、练习:根据一本图书作者数量的多少对查询集QuerySet进行排序

sql语句:

  select  title,count(*) from app01_book inner join app01_book_authors on app01_book.id=app01_book_authors.book_id group by app01_book.id order by count(*);

# 练习:根据一本图书作者数量的多少对查询集QuerySet进行排序msg = models.Book.objects.annotate(num_author=Count("authors__name")).order_by("num_author").values("title", "num_author")print(msg)# <QuerySet [{'title': '冲灵剑法', 'num_author': 1}, # {'title': '吸星大法', 'num_author': 1}, # {'title': '独孤九剑', 'num_author': 2}]>

 6、练习:查询各个作者出的书的总价格

# 练习:查询各个作者出的书的总价格books = models.Author.objects.annotate(total=Sum("book__price")).values('name', 'total')print(books)# <QuerySet [{'name': '任我行', 'total': Decimal('390.00')}, # {'name': '任盈盈', 'total': Decimal('140.00')}, # {'name': '令狐冲', 'total': None}]>

4.F查询与Q查询

F查询

在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?

 Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

# 查询工资大于年龄的人

# 查询工资大于年龄的人from django.db.models import F, Qbooks = models.Emp.objects.filter(salary__gt=F('age'))print(books)# <QuerySet [<Emp: Emp object (1)>, # <Emp: Emp object (2)>, # <Emp: Emp object (3)>,# <Emp: Emp object (4)>, # <Emp: Emp object (5)>]>

Q查询

 filter() 等方法中的关键字参数查询都是一起进行“AND” 的。 如果你需要执行更复杂的查询(例如OR 语句),你可以使用Q 对象。

# 查询价格大于310或者不是2011年12月的书籍books = models.Book.objects.filter(Q(price__gt=310)|~Q(Q(pub_date__year=2011)&Q(pub_date__month=12)))print(books)# <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>

转载于:https://www.cnblogs.com/longerandergou/p/11160278.html

Day51python Django 多表操作 聚合查询、分组查询、F查询、Q查询相关推荐

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

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

  2. Django聚合分组查询(F与Q查询|ORM查询优化|常见字段参数)

    文章目录 一.正反向查询进阶操作 二.聚合查询 三.分组查询 四.ORM再次添加字段 五.F与Q查询 五.ORM查询优化 六.事务操作 七.模型层常见字段 八.ORM常见字段参数 九.多对多三种创建方 ...

  3. Django08-1:模型层(ORM)--聚合查询/分组查询/F与Q查询/开启事务/常用字段及参数/自定义字段/数据库查询优化

    聚合查询 单独使用时,用aggregate 1.只要是跟数据库相关的模块 基本都在django.db.models里面 如果没有应该在django.db里面 2. 聚合查询通常配合分组使用 from ...

  4. Django 【第六篇】ORM跨表操作(聚合查询,分组查询,F和Q查询等)

    一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出 ...

  5. Django多表操作

    一.一对多操作.多对多操作 二.基于对象的跨表查询 三.基于双下划线的查询 一.一对多操作 先在app目录下手撸orm #创建模型分析 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓 ...

  6. Django 多表操作

    文章目录 一.多表关系 二.一对一 `2.1.创建模型关系` `2.2.增删改查` 增: 查 改 删 三.一对多 `3.1.创建模型关系` 3.1.1.设计三张表 3.1.2.同步数据到数据库 `3. ...

  7. Day49 orm 操作 Django单表操作

    1.ORM简介 对象关系映射(Object Relational Mapping,简称ORM).简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. O ...

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

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

  9. Django Model各种操作 Meta 常用字段 一对多操作 多对对操作 F Q查询 聚合函数

    Model操作 meta源信息 class CLS(models.Model):username = models.CharField(max_length=32)class Meta:db_tabl ...

最新文章

  1. RNN情感分类问题实战
  2. ROS知识【11-1】:建立用户自己的工作空间、功能包
  3. SAP标准OK Code Values 列表
  4. 5 table滑动固定_内滑动钢套钢蒸汽直埋保温钢管
  5. php 输出01,php基础01_thinkphp输出Hello World-Go语言中文社区
  6. 隐马尔科夫模型原理解析
  7. HMC 命令行登陆设置
  8. Asp.Net MVC Web应用程序中的安全向量
  9. 遥感图像的辐射畸变与辐射校正
  10. Mobile Terminal 316s-7 使用技巧
  11. 达尔优108机械合金版键盘驱动 正式版
  12. 携程数据开发2022留用实习面试
  13. 台式计算机怎么开关网络,怎么用台式电脑开wifi_台式电脑如何开启wifi
  14. mysql数据库的封装
  15. seo专员日常工作内容是什么?
  16. Codeforces Round #176 (Div. 2) D. Shifting(模拟,STLdeque应用)
  17. sigprocmask , sigpending 和 sigsuspend函数
  18. varbinary 转换成 varchar
  19. 如何将PDF发邮件到kindle转换为azw
  20. tableau desktop 10.3 使用时间驻留器失败

热门文章

  1. 14.装逼又实用技能---给服务器设置本地和远程登录的欢迎语
  2. 我收藏了这些CSS3动画工具
  3. Update:实时后端云服务野狗获 2400 万 Pre-A 融资
  4. win7计算机显示空白,win7系统“打开或关闭windows功能”显示一片空白的解决方法...
  5. rust绿狙_《喷射战士2》武器评测与使用技巧指南——绿狙篇
  6. 反弹后门的实现(附源代码及编译好的程序,免费下载)
  7. 机器人 魔哒解说_属德斯解说机器人大乱斗
  8. 四级网络工程师:局域网技术
  9. 1705. 吃苹果的最大数目(贪心算法)
  10. sqli-labs靶场15-19关通关笔记中总结