聚合函数

聚合函数笔记:

  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. aggregateannotate的相同和不同:

    • 相同:这两个方法都可以执行聚合函数。
    • 不同:
      • 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. MaxMin:求指定字段的最大值和最小值。示例代码如下:

    result = Author.objects.aggregate(max=Max("age"),min=Min("age"))
    
  8. Sum:求某个字段值的总和。示例代码如下:

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

    aggregateannotate方法可以在任何的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))
      
    • 获取价格大于100,并且图书名字中不包含”传“字的图书:
      books = Book.objects.filter(Q(price__gte=100)&~Q(name__icontains='传'))
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值