• 聚合函数


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



     

  • 相关阅读:
    生成随机数的范围的公式
    正则匹配<img src="xxxxxx" alt="" />标签的相关写法
    js 日常问题记录
    css 三角实例
    /users/products.:format 这种写法的其对应解析字符写法
    package.json 的语法解释
    replace 全局替换 和 数组去空
    js checkbox获取选中的值
    JavaScript基础知识一
    移动 Web 设计
  • 原文地址:https://www.cnblogs.com/allwell/p/9459376.html
Copyright © 2020-2023  润新知