• 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()

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

    看十遍不如自己写一遍!巩固基础,纵横开拓!
  • 相关阅读:
    Handler
    declare-styleable的使用
    Android APK反编译就这么简单 详解(附图)
    webview与js交互
    Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端
    eclipse中的.project 和 .classpath文件的具体作用
    android:关于主工程和library project
    block,inline和inline-block概念和区别
    容易被忽略CSS特性
    CSS里常见的块级元素和行内元素
  • 原文地址:https://www.cnblogs.com/gyxpy/p/14716056.html
Copyright © 2020-2023  润新知