聚合函数 取名: 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. 剪格子---(dfs回溯)

    如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以 ...

  2. python特殊函数__str__、__repr__和__len__

    1.__str__ 首先介绍__str__ class Students(object): def __init__(self, *args): self.names = args # def __s ...

  3. The way to unwind the stack on Linux EABI

    I. probe the stack frame structure The original idea is to unwind the function call stack according ...

  4. 【WordCount】实现(重做)

    Gitee项目地址: https://gitee.com/LIUJIA6/wordcount_implementation 需求说明: WordCount的需求可以概括为:对程序设计语言源文件统计字符 ...

  5. office 2016密钥

    Office 2016 Pro Plus Retail 版激活密钥:[Key]:3XJTG-YNBMY-TBH9M-CWB2Y-YWRHH[Key]:6TCQ3-NBBJ2-RTJCM-HFRKV-G ...

  6. 关于矩阵快速幂的用法总结QwQ

    umm首先矩阵快速幂的板子就不港了比较简单的还是?就结合二进制地理解一下就好了,代码可以翻蒟蒻の考前续命这里面放了我记得? 主要是说下应用趴? 目前我会的似乎就是个矩阵加速?简单来说就是个给一个递推式 ...

  7. favorite learning link

    Xpath https://www.cnblogs.com/chenshaoping/p/5540434.html Awk Sort https://www.cnblogs.com/chengmo/a ...

  8. 浅尝 Vue 中的 computed 属性 与 watch

    对于 computed 的理解: ①.computed 用来监控自己定义的变量,该变量不在 data 里面声明,直接在 computed里面定义,然后就可以在页面上进行双向数据绑定展示出结果或者用作其 ...

  9. 解决win10无法访问共享

    一台win10共享的文件夹,有的电脑是可以访问的,我的win10 访问不了,说什么 遇到未知错误,用以下方法得以解决 ----------------------------------------- ...

  10. selenium 淘宝登入反爬虫解决方案(亲测有效)

    前言 目前在对淘宝进行数据爬取的时候都会碰到,登入时的滑块问题,无论是手动还是脚本都不成功.这里的很重要一个原因是很多的网站都对selenium做了反爬虫机制.接下来是笔者参考网上的网友们的方法亲自测 ...