zoukankan      html  css  js  c++  java
  • 聚合函数

    1. 所有的聚合函数都是放在`django.db.models`下面。
    2. 聚合函数不能够单独的执行,需要放在一些可以执行聚合函数的方法下面中去执行。比如`aggregate`。示例代码如下:

    result = Book.objects.aggregate(Avg("price"))

    3. 聚合函数执行完成后,给这个聚合函数的值取个名字。取名字的规则,默认是`filed+__+聚合函数名字`形成的。比如以上代码形成的名字叫做`price__avg`。如果不想使用默认的名字,那么可以在使用聚合函数的时候传递关键字参数进去,参数的名字就是聚合函数执行完成的名字。实示例代码如下:

    result = Book.objects.aggregate(avg=Avg("price"))

    以上传递了关键字参数`avg=Avg("price")`,那么以后`Avg`聚合函数执行完成的名字就叫做`avg`。
    4. `aggregate`:这个方法不会返回一个`QuerySet`对象,而是返回一个字典。这个字典中的key就是聚合函数的名字,值就是聚合函数执行后的结果。
    5. `aggregate`和`annotate`的相同和不同:

      * 相同:这两个方法都可以执行聚合函数。

      *不同:

        -’aggregate`返回的是一个字典,在这个字典中存储的是这个聚合函数执行的结果。而`annotate`返回的是一个`QuerySet`对象,并且会在查找的模型上添加一个聚合函数的属性。

        -`aggregate`不会做分组,而`annotate`会使用`group by`子句进行分组,只有调用了`group by`子句,才能对每一条数据求聚合函数的值。

    6. `Count`:用来求某个数据的个数。比如要求所有图书的数量,那么可以使用以下代码:

    result = Book.objects.aggregate(book_nums=Count("id"))

      并且`Count`可以传递`distinct=True`参数,用来剔除那些重复的值,只保留一个。比如要获取作者表中,不同邮箱的个数,那么这时候可以使用`distinct=True`。示例代码如下:

    result = Author.objects.aggregate(email_nums=Count('email',distinct=True))

    7. `Max`和`Min`:求指定字段的最大值和最小值。示例代码如下:

    result = Author.objects.aggregate(max=Max("age"),min=Min("age"))

    8. `Sum`:求某个字段值的总和。示例代码如下:

    result = BookOrder.objects.aggregate(total=Sum('price'))

      `aggregate`和`annotate`方法可以在任何的`QuerySet`对象上调用。因此只要是返回了`QuerySet`对象,那么就可以进行链式调用。比如要获取2018年度的销售总额,那么可以先过滤年份,再求聚合函数。示例代码如下:

     BookOrder.objects.filter(create_time__year=2018).aggregate(total=Sum('price'))

    9. `F表达式`: 动态的获取某个字段上的值。并且这个F表达式,不会真正的去数据库中查询数据,他相当于只是起一个标识的作用。比如想要将原来每本图书的价格都在原来的基础之上增加10元,那么可以使用以下代码来实现:

    from django.db.models import F
    Book.objects.update(price=F("price")+10)

    10. `Q表达式`:使用`Q`表达式包裹查询条件,可以在条件之间进行多种操作。与/或非等,从而实现一些复杂的查询操作。例子如下:

    * 查找价格大于100,并且评分达到4.85以上的图书:

    # 不使用Q表达式的
    books = Book.objects.filter(price__gte=100,rating__gte=4.85)
    # 使用Q表达式的
    books = Book.objects.filter(Q(price__gte=100)&Q(rating__gte=4.85))

    * 查找价格低于100元,或者评分低于4分的图书:

    books = Book.objects.filter(Q(price__gte=100)&Q(rating__gte=4.85))



     

  • 相关阅读:
    org.apache.poi.ss.usermodel 类操作excel数据遗漏
    小强的HTML5移动开发之路(13)——HTML5中的全局属性
    小强的HTML5移动开发之路(12)——从一个多媒体标签说起
    我们是怎样将网站加载时间减少 24% 的?
    CSS书写位置
    彻底理解浏览器缓存机制
    css的repaint和reflow
    CSS Reset浏览器样式重置
    专业Web设计师应该避免的6个关键错误
    网站服务器的选择
  • 原文地址:https://www.cnblogs.com/allwell/p/9459376.html
Copyright © 2011-2022 走看看