聚合函数 取名: field + __ + 聚合函数名字 ,如:price__avg;可传关键字参数修改名字:avg=Avg("price");

aggregate:不会返回一个 QuerySet 对象,而是返回一个字典,key为聚合函数的名字,value为聚合函数执行结果;

annotate:返回一个 QuerySet 对象;

相同点:

  1. 都可执行聚合函数;可在任何的‘QuerySet’对象上调用,因此只要返回了‘QuerySet’对象,即可进行链式调用,如 index5 中获取年度销售总额,可先过滤年份再求聚合函数;

不同点:

  1. aggregate 返回一个字典,字典中存储聚合函数执行的结果;而 annotate 返回一个 QuerySet对象 ,并在查找的模型上添加一个聚合函数的属性;
  2. aggregate 不会做分组,而 annotate 会使用 Group by 字句进行分组,只有调用该字句才能对每一条数据求聚合函数的值;
  • 数据库中的内容

  • models.py文件:

     from django.db import models
    
     class Author(models.Model):
    '''作者模型'''
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    email = models.EmailField() class Meta:
    db_table = 'author' class Publisher(models.Model):
    '''出版社模型'''
    name = models.CharField(max_length=300) class Meta:
    db_table = 'publisher' class Book(models.Model):
    '''图书模型'''
    name = models.CharField(max_length=300)
    pages = models.IntegerField()
    price = models.FloatField()
    rating = models.FloatField()
    author = models.ForeignKey(Author,on_delete=models.CASCADE)
    publisher = models.ForeignKey(Publisher,on_delete=models.CASCADE) class Meta:
    db_table = 'book' class Bookorder(models.Model):
    '''图示订单模型'''
    book = models.ForeignKey('Book',on_delete=models.CASCADE)
    price = models.FloatField()
    create_time = models.DateTimeField(auto_now_add=True,null=True) class Meta:
    db_table = 'book_order'
  • views.py文件:

     from django.shortcuts import render
    from django.http import HttpResponse
    from .models import Author,Publisher,Book,Bookorder
    from django.db.models import Avg,Count,Max,Min,Sum
    from django.db import connection def index(request):
    # 获取所有图书定价的平均价(使用aggregate);Avg:平均值;
    result = Book.objects.aggregate(Avg('price'))
    print(result)
    print(connection.queries)
    return HttpResponse('index')
    # >>>{'price__avg': 97.25}
    # >>>{'price__avg': 97.25}
    # {'sql': 'SELECT AVG(`book`.`price`) AS `price__avg` FROM `book`'; def index2(requset):
    # 获取每一本销售的平均价格(使用annotate);
    books = Book.objects.annotate(avg=Avg('bookorder__price'))
    for book in books:
    print("%s:%s" % (book.name,book.avg))
    print(connection.queries)
    return HttpResponse('index2')
    #三国演义:89.33333333333333
    # 水浒传:93.5
    # 西游记:None
    # 红楼梦:None
    # `book_order` ON (`book`.`id` = `book_order`.`book_id`) GROUP BY `book`.`id` ORDER BY NULL'; def index3(request):
    # book 表中总共有多少本书;
    # Count:求某个数据的的个数;
    result = Book.objects.aggregate(nums=Count('id'))
    # author 表中总共有多少个不同的邮箱;
    # 使用‘distinct=True’剔除重复的值;
    results = Author.objects.aggregate(book_num=Count('email',distinct=True)) # 统计每本书的销量
    books = Book.objects.annotate(book_nums=Count('bookorder'))
    for book in books:
    print("%s:%s" % (book.name,book.book_nums))
    print(books)
    print(connection.queries)
    return HttpResponse("index3")
    # 三国演义:3
    # 水浒传:2
    # 西游记:0
    # 红楼梦:0 def index4(request):
    result = Author.objects.aggregate(max=Max('age'),min=Min('age'))
    # 每本图书售卖前的最大及最小价格;
    books = Book.objects.annotate(max=Max("bookorder__price"),min=Min("bookorder__price"))
    for book in books:
    print("%s:%s:%s" % (book.name,book.max,book.min))
    print(connection.queries)
    return HttpResponse("index4") # 三国演义:95.0:85.0
    # 水浒传:94.0:93.0
    # 西游记:None:None
    # 红楼梦:None:None def index5(request):
    # 求所有图书的销售总额;
    result = Book.objects.aggregate(total=Sum("price"))
    print(result)
    print(connection.queries)
    # {'total': 389.0}
    # {'sql': 'SELECT SUM(`book`.`price`) AS `total` FROM `book`', 'time': '0.001'}; # 求每一本图书的销售总额;
    books = Book.objects.annotate(total=Sum('bookorder__price'))
    for book in books:
    print("%s:%s" % (book.name,book.total))
    print(connection.queries)
    # 三国演义: 268.0
    # 水浒传: 187.0
    # 西游记: None
    # 红楼梦: None # 求2018年度的销售总额;
    result = Bookorder.objects.filter(create_time__year=2019).aggregate(total=Sum("price"))
    # 求2018年度每一本图书的销售总额;
    books = Book.objects.filter(bookorder__create_time__year=2019).annotate(total=Sum("bookorder__price"))
    for book in books:
    print("%s:%s" % (book.name,book.total) )
    print(connection.queries)
    # 三国演义: 268.0
    # 水浒传: 187.0
    # `book_order`.`create_time` BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 23:59:59.999999' GROUP BY `book`.`id`
  • F表达式:动态获取某个字段上的值,不会真正到数据库中查询数据,只起一个标识的作用;

     def index6(requset):
    # 给每本书售价增加10元;update;
    Book.objects.update(price=F('price')+10)
    print(connection.queries[-1])
    # 'UPDATE `book` SET `price` = (`book`.`price` + 10)'; # Author中name与email相同的内容;
    authors = Author.objects.filter(name=F('emile'))
    for author in authors:
    print("%s:%s" % (author.name,author.email))
    return HttpResponse('index6')
  • Q表达式:包裹查询条件,可在条件间进行多种操作:与 & 、或 | 、非 ~  等查询操作;
     def index7(requset):
    # 1、获取价格大于100,评分大于4.5的图书;
    # books = Book.objects.filter(price__gte=100,rating=4.5)
    books = Book.objects.filter(Q(price__gte=100)&Q(rating__gte=4.5))
    for book in books:
    print("%s:%s:%s" % (book.name,book.price,book.rating)) --- # 2、获取价格低于100,或者评分低于4.5分的图书;
    books = Book.objects.filter(Q(price__lt=100)|Q(rating__lt=4.5))
    for book in books:
    print("%s:%s:%s" % (book.name,book.price,book.rating)) --- # 3、获取价格大于100,并且图书名字不包含“传”字的图书;
    books = Book.objects.filter(Q(price__gte=100)&~Q(name__icontains='传'))
    for book in books:
    print("%s:%s:%s" % (book.name,book.price,book.rating))
    return HttpResponse('index7')

聚合函数与F/Q表达式的更多相关文章

  1. Django之ORM操作(聚合 分组、F Q)

    Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作.   键的名 ...

  2. ORM之自关联、add、set方法、聚合函数、F、Q查询和事务

    一.外键自关联(一对多) 1.建表 # 评论表 class Comment(models.Model): id = models.AutoField(primary_key=True) content ...

  3. 聚合和分组F,Q和事物,cookie,session

    聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典. 键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函数的名称自动生成出 ...

  4. sql语句 之聚合函数

      聚合分析 在访问数据库时,经常需要对表中的某列数据进行统计分析,如求其最大值.最小值.平均值等.所有这些针对表中一列或者多列数据的分析就称为聚合分析. 在SQL中,可以使用聚合函数快速实现数据的聚 ...

  5. Sql Server的艺术(三) SQL聚合函数的应用

    SQL提供的聚合函数有求和,最大值,最小值,平均值,计数函数等. 聚合函数及其功能: 函数名称 函数功能 SUM() 返回选取结果集中所有值的总和 MAX() 返回选取结果集中所有值的最大值 MIN( ...

  6. orm中的聚合函数,分组,F/Q查询,字段类,事务

    目录 一.聚合函数 1. 基础语法 2. Max Min Sum Avg Count用法 (1) Max()/Min() (2)Avg() (3)Count() (4)聚合函数联用 二.分组查询 1. ...

  7. $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数

        一.聚合函数    from django.db.models import Avg,Sum,Max,Min,Count,F,Q   #导入    # .查询图书的总价,平均价,最大价,最小价 ...

  8. Django查找数据库objects.filter() 排序order_by Q()与或非 F()属性之间比较 聚合函数的用法

    条件选取QuerySet的时候,filter表示=参数可以写查询条件,exclude表示!=,querySet.distinct() 去重复(除了get返回值都是QuerySet,可以继续调用所有函数 ...

  9. Django ORM 多对多操作 使用聚合函数和分组 F查询与Q查询

    创建表 # models.py form django.db import models class Book(models.Model): # 表名book,django会自动使用项目名+我们定义的 ...

随机推荐

  1. solr下载安装

    原文查阅:https://www.cnblogs.com/cenwei/p/6527081.html 下载地址(版本众多):http://archive.apache.org/dist/lucene/ ...

  2. JavaScript基础知识(数据类型)

    数据类型 布尔:true/fasle console.log(typeof true);// "boolean" Number : true -->1 false --> ...

  3. vivado/FPGA 使用小纪

    1.使用FPGA做为外部控制器的总线译码时,将总线时钟接在全局时钟脚上(MRCC),就算接在了局部时钟(SRCC)上,也要通过BUFG转为全局时钟走线,否则会因为local clk到各部分的时延较大引 ...

  4. python基础(15)-socket网络编程&socketserver

    socket 参数及方法说明 初始化参数 sk = socket.socket(参数1,参数2,参数3) 参数1:地址簇 socket.AF_INET IPv4(默认) socket.AF_INET6 ...

  5. golang schedule crash

    golang 起超过100W的goroutine就会crash,这个算不算是个bug? 2036119xxxxpanic: inconsistent poll.fdMutex goroutine 20 ...

  6. PHP on CentOS (LAMP) and wordpress

    http://php.net/manual/zh/install.windows.php https://www.unixmen.com/install-wordpress-centos-7-linu ...

  7. Python基础(十一) 类继承

    类继承: 继承的想法在于,充份利用已有类的功能,在其基础上来扩展来定义新的类. Parent Class(父类) 与 Child Class(子类): 被继承的类称为父类,继承的类称为子类,一个父类, ...

  8. 关于SLG的产品市场判断

    SLG游戏是我自己主攻的未来产品方向,以下几个板块是我自己想着力挖掘的用户艺术: 1)经营能力(包括资源的规划,调配,成长性预期,以及投产比如何向用户选择向最大化) 2)统筹能力(包括自我资源的有效整 ...

  9. CentOS 7 nginx+tomcat9 session处理方案之session复制

    我们的目标是所有服务器上都要保持用户的Session,那么将每个应用服务器中的Session信息复制到其它服务器节点上是不是就可以呢? 这就是Session的第二中处理办法:会话复制 192.168. ...

  10. 游戏客户端Session的统一管理

    看本系统文章需要些C语言.数据结构和网络基础知识! 说明:由于游戏服务器端会有成千上万的客户端进行连接请求,所以要求我们需要做一些简单的会话管理!如下图 1.简单说明 进行统一的分配和管理,就需要我们 ...