美文网首页Django入门开发实战
Django模型层之多表操作(五)之聚合查询与分组查询

Django模型层之多表操作(五)之聚合查询与分组查询

作者: 乔治大叔 | 来源:发表于2019-01-25 16:58 被阅读27次

聚合查询与分组查询

聚合

aggregate(*args, **kwargs)

计算所有图书的平均价格

from django.db.models import Avg
Book.objects.all().aggregate(Avg('price'))
{'price__avg': 34.35}

aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。

Book.objects.aggregate(average_price=Avg('price'))
{'average_price': 34.35}

如果你希望生成不止一个聚合,你可以向aggregate()子句中添加另一个参数。所以,如果你也想知道所有图书价格的最大值和最小值,可以这样查询:

from django.db.models import Avg, Max, Min
Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))
{'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}

# 查询所有书籍的平均价格
    from django.db.models import Avg,Count,Max,Min
    ret=Book.objects.all().aggregate(Avg('price'))
    # {'price__avg': 202.896}
    # 可以改名字
    ret=Book.objects.all().aggregate(avg_price=Avg('price'))
    # 统计平均价格和最大价格
    ret=Book.objects.all().aggregate(avg_price=Avg('price'),max_price=Max('price'))
    # 统计最小价格
    ret = Book.objects.all().aggregate(avg_price=Avg('price'), min_price=Min('price'))
    # 统计个数和平均价格
    ret = Book.objects.all().aggregate(avg_price=Avg('price'), max_price=Max('price'),count=Count('price'))
    ret = Book.objects.all().aggregate(avg_price=Avg('price'), max_price=Max('price'),count=Count('nid'))
    print(ret)

分组

annotate()为调用的QuerySet中每一个对象都生成一个独立的统计值(统计方法用聚合函数)。

总结 :跨表分组查询本质就是将关联表join成一张表,再按单表的思路进行分组查询。

查询练习

练习:统计每一本书作者个数

from django.db.models import Avg, Max, Sum, Min, Max, Count
book_list = models.Book.objects.all().annotate(author_num=Count("authors"))
for book in book_list:
     print(book.name)
     print(book.author_num)
book_list = models.Book.objects.all().annotate(author_num=Count("authors")).values('name','author_num')
print(book_list)

练习:统计每一个出版社的最便宜的书

publishList=Publish.objects.annotate(MinPrice=Min("book__price"))
for publish_obj in publishList:
print(publish_obj.name,publish_obj.MinPrice)

annotate的返回值是querySet,如果不想遍历对象,可以用上valuelist:

queryResult= Publish.objects.annotate(MinPrice=Min("book__price")).values_list("name","MinPrice")
print(queryResult)

练习:统计每一本以py开头的书籍的作者个数:

queryResult=Book.objects.filter(title__startswith="Py").annotate(num_authors=Count('authors'))

练习:统计不止一个作者的图书:(作者数量大于一)

ret=models.Book.objects.annotate(author_num=Count("authors")).filter(author_num__gt=1).values('name','author_num')
print(ret)

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

Book.objects.annotate(num_authors=Count('authors')).order_by('num_authors')

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

ret=models.Author.objects.annotate(sum_price=Sum("book__price")).values("name", "sum_price")
print(ret)

练习:查询每个出版社的名称和书籍个数

ret=models.Publish.objects.all().annotate(c=Count('book__name')).values('name','c')
print(ret)

相关文章

  • Django模型层之多表操作(五)之聚合查询与分组查询

    聚合查询与分组查询 聚合 aggregate(*args, **kwargs) 计算所有图书的平均价格 from ...

  • Python MySQL数据库2:数据库查询

    总体内容 一、数据准备、基本的查询 二、条件查询 三、排序 四、聚合、分组 五、分页 六、连接查询(多表的时候有用...

  • Django模型层之多表操作(六)之F查询与Q查询

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

  • MySQL约束课堂笔记

    今日内容 一、DQL:查询语句2、排序查询3、聚合函数4、分组查询5、分页查询二、约束三、多表之间的关系 DQL:...

  • MySQL-6:查询语句

    1、DQL:查询语句: 1.排序查询 2.聚合函数 3.分组查询 4.分页查询 2、约束3、多表之间的关系4、范式...

  • Mysql 1.数据库进阶

    1.DQL:查询语句排序查询聚合函数分组查询分页查询2.约束3.多表之间的联系4.范式5.数据库的备份与还原 排序...

  • 数据库查询语句

    条件与逻辑查询 模糊查询 范围查询 排序 聚合函数 分组 连接查询 分页 子查询

  • Django聚合查询及分组查询

    导入聚合函数方法 聚合查询查询所有书籍的数量 上面的方法执行返回的结果是一个字典,其中sum作为键,查询结果作为值...

  • Django模型(四)

    Django模型 知识点: 表关联对象 多表查询 表关联对象 前向查询 如果一个模型具有ForeignKey,那么...

  • MySQL常用语句

    添加 删除 修改 查询 聚合函数 子查询 多表查询 WHERE子句

网友评论

    本文标题:Django模型层之多表操作(五)之聚合查询与分组查询

    本文链接:https://www.haomeiwen.com/subject/rwhvjqtx.html