• ORM聚合查询与分组查询


    聚合(利用聚合函数)

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

    键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。

    用到的内置函数:

    from django.db.models import Avg,Sum,Max,Min,Count
    

    示例:

    >>> from django.db.models import Avg,Sum,Max,Min,Count
    >>> models.Book.object.all().aggregate(Avg("price"))
    {'price__avg':13.233333}
    

    如果你想要为聚合值指定一个名称,可以向聚合子句提供它。

    >>> models.Book.objects.aggregate(average_price=Avg('price'))
    {'average_price':13.233333}
    

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

    >>> models.Book.objects.all().aggregate(Avg("price"), Max("price"), Min("price"))
    {'price__avg': 13.233333, 'price__max': Decimal('19.90'), 'price__min': Decimal('9.90')}
    

    分组

    们在这里先复习一下SQL语句的分组。

    假设现在有一张公司职员表:

    img

    我们使用原生SQL语句,按照部分分组求平均工资:

    select dept,AVG(salary) from employee group by dept;
    

    ORM查询:

    from django.db.models import Avg
    Employee.objects.values("dept").annotate(avg=Avg("salary").values(dept, "avg")
    这里需要注意的是annotate分组依据就是他前面的值,
    如果前面没有特点的字段,则默认按照ID分组,
    这里有dept字段,所以按照dept字段分组
    

    连表查询的分组:

    img

    SQL查询:

    select dept.name,AVG(salary) from employee inner join dept on (employee.dept_id=dept.id) group by dept_id;
    

    ORM查询:

    from django.db.models import Avg
    models.Dept.objects.annotate(avg=Avg("employee__salary")).values("name", "avg")
    
  • 相关阅读:
    Delphi数据库处理
    cxgrid的FINDPANEL编程
    LESS简介
    LESS速查
    $(window).load(function() {})和$(document).ready(function(){})的区别
    CSS中单位px和em,rem的区别
    父元素与子元素之间的margin-top问题
    CSS垂直居中精华总结
    Font Awesome使用指南
    Sublime3安装过程及常用插件安装及常用快捷键
  • 原文地址:https://www.cnblogs.com/aden668/p/11738984.html
Copyright © 2020-2023  润新知