zoukankan      html  css  js  c++  java
  • Django之ORM聚合查询、分组查询

    ORM聚合查询

    聚合查询

    五个聚合函数的时候,max min avg count sum,要先导入,一般配合分组一起使用

    from django.db.models import Min,Max,Count,Sum,Avg
    1.所有书的平均价格
    单单想使用聚合函数,但不想分组,mysql不可以,但orm中可以,不过要用到aggregate
    res = models.Book.objects.aggregate(Ang("price"))
    一次性全拿
    res = models.Book.objects.aggregate(Ang("price"),Min(“price”),Max(“price”),Count(“price”),Sum(“price”))

    单独使用聚合的很少,都是配合分组一起使用。

    ORM分组查询

    annotate=mysql中的group by

    mysql中默认是严格模式,ONLY_FULL_GROUP_BY

    分组之后默认只能获取到分组的依据,

    组内的其他字段都无法直接获取了。

    到了orm中,分组查询

    1.统计每本书的作者个数(按书分组)
    # res =models.Book.objects.annotate() models后面点什么,就按什么分组。
    res =models.Book.objects.annotate(author_num = Count("authors_ _id")).values("title","author_num")
    这里又涉及到跨表,Count中authors跨表,_ _然后表示字段
    author_num是自定义字段,用来存储统计出来的每本书对应的作者个数。
    authors__id可以不加__id,orm自动按主键统计。
    2.统计每个出版社卖的最便宜的书价,反向
    res=models.Publish.objects.annotate(min_price=Min("book__price")).values("name","min_price")
    3.统计不止一个作者的图书
    res=models.Book.obejcts.annotate(author_num=Count("authors")).filter(author_num__gt=1).values("title","author_num")
    只要orm语句得出的结果还是一个queryset对象,就可以继续无限的点queryset对象封装的方法
    4.查询每个作者出版的书的总价格
    res = models.Auhtors.objects.annote(total_price=Sum("book__price")).values("namec ","total_price")
    如果想按照指定的字段分组呢?
    models.Book.objects.values("price").annotate()

     如果分组报错了,那么要修改数据库的严格模式,说明分组后只能拿分组字段,其他字段不能拿。

    看十遍不如自己写一遍!巩固基础,纵横开拓!
  • 相关阅读:
    webpack安装填坑('webpack' 不是内部或外部命令,也不是可运行的程序或批处理文件)
    JS中let和var的区别(附加const声明特点)
    浅谈 var bool= false 和 var bool= new Boolean(false)的区别
    "if (!(""a"" in window)) { var a = 1; } alert(a); 为什么结果是undefined"
    浅谈display: none、visibility: hidden、overflow: hidden、opacity: 0
    10Git服务器搭建
    09Git GitHub
    08Git标签
    07Git查看提交历史
    自举驱动电路原理
  • 原文地址:https://www.cnblogs.com/gyxpy/p/14716056.html
Copyright © 2011-2022 走看看