Sum:某个字段的总和。

1. 求图书的销售总额,示例代码如下:

  1. from django.http import HttpResponse
  2. from django.db import connections
  3. from .models import BookOrder, Book
  4. from django.db.models import Sum
  5. def index(request):
  6. # 1.求图书的销售总额
  7. sum = BookOrder.objects.aggregate(sum=Sum('price'))
  8. print(sum)
  9. # {'sum': 622.0}
  10. print(connection.queries)
  11. # [{'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'},
  12. # {'sql': 'SELECT SUM(`book_order`.`price`) AS `sum` FROM `book_order`', 'time': '0.000'}]
  13. return HttpResponse("success !")
其中,models.py文件中的模型定义为:
  1. from django.db import models
  2. # 定义图书模型
  3. class Book(models.Model):
  4. name = models.CharField(max_length=100, unique=True)
  5. pages = models.IntegerField()
  6. price = models.FloatField()
  7. rating = models.FloatField()
  8. author = models.ForeignKey('Author', on_delete=models.CASCADE)
  9. publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE)
  10. class Meta:
  11. db_table = 'book'
  12. def __str__(self):
  13. return "(书名:%s,页数:%s,价格:%s,打折:%s,作者:%s,出版社:%s)" % (self.name, self.pages, self.price, self.rating, self.author, self.publisher)
  14. # 定义预定图书的模型
  15. class BookOrder(models.Model):
  16. book = models.ForeignKey('Book', on_delete=models.CASCADE)
  17. price = models.FloatField()
  18. time = models.DateTimeField(auto_now_add=True, null=True)
  19. class Meta:
  20. db_table = 'book_order'
定义完成模型之后,在终端命令行窗口,执行命令:python manage.py makemigrations, 生成迁移脚本文件,python manage.py migrate.将生成的迁移脚本文件映射到数据库中。
mysql数据库book_order表中数据为:

mysql数据库中book表中的数据为:

2.求每一种书的销售总额,示例代码如下:

  1. def index(request):
  2. # 2.求每一本图书的销售总额
  3. # 将每一本书使用annotate()方法进行分组,并且调用Sum(),统计每一本书的销售总额
  4. # 执行anntate()方法对字段进行操作的时候,会为模型添加一个指定名字的字段,默认情况下,添加的字段的名字为:field__聚合函数名,
  5. # 但是同样也可以对字段名字进行指定,比如,以下就指定为sum.
  6. # 注意:添加的这个字段,并没有添加到数据库中如果进行遍历books,打印出每一本书的信息,则信息中只有在models.py中已经定义的属性。而不会有执行annotate()函数添加的字段。
  7. # 但是在进行输出的时候同样可以进行打印出该属性所有的信息
  8. books = Book.objects.annotate(sum=Sum('bookorder__price'))
  9. for book in books:
  10. # 打印出每一本书中,由于执行annotate()方法和聚合函数Sum()方法添加的属性sum信息。
  11. print("%s,%s"%(book.name, book.sum))
  12. # 打印出结果:
  13. # 三国演义,203.0
  14. # 水浒传,215.0
  15. # 红楼梦,204.0
  16. # 西游记,None
  17. # 打印出数据库中book的信息
  18. print(book)
  19. # (书名:三国演义,页数:893,价格:129.0,打折:0.8,作者:罗贯中,47,312587329@qq.com,出版社: ->:清华大学出版社)
  20. # (书名:水浒传,页数:983,价格:159.0,打折:0.75,作者:施耐庵,57,1924572@qq.com,出版社: ->:吉林大学出版社)
  21. # (书名:红楼梦,页数:1543,价格:199.0,打折:0.85,作者:曹雪芹,42,123521472@qq.com,出版社: ->:浙江大学出版社)
  22. # (书名:西游记,页数:1003,价格:159.0,打折:0.75,作者:吴承恩,34,193452272@qq.com,出版社: ->:清华大学出版社)
  23. # 打印出django底层所执行的sql语句
  24. print(connection.queries)
  25. # [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'},
  26. # {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'},
  27. # {'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, SUM(`book_order`.`price`) AS `sum` FROM `book` LEFT OUTER JOIN `book_order` ON (`book`.`id` = `book_order`.`book_id`) GROUP BY `book`.`id` ORDER BY NULL', 'time': '0.000'},
  28. # {'sql': 'SELECT `author`.`id`, `author`.`name`, `author`.`age`, `author`.`email` FROM `author` WHERE `author`.`id` = 5 LIMIT 21', 'time': '0.016'},
  29. # {'sql': 'SELECT `publisher`.`id`, `publisher`.`name` FROM `publisher` WHERE `publisher`.`id` = 2 LIMIT 21', 'time': '0.000'},
  30. # {'sql': 'SELECT `author`.`id`, `author`.`name`, `author`.`age`, `author`.`email` FROM `author` WHERE `author`.`id` = 1 LIMIT 21', 'time': '0.000'},
  31. # {'sql': 'SELECT `publisher`.`id`, `publisher`.`name` FROM `publisher` WHERE `publisher`.`id` = 1 LIMIT 21', 'time': '0.000'},
  32. # {'sql': 'SELECT `author`.`id`, `author`.`name`, `author`.`age`, `author`.`email` FROM `author` WHERE `author`.`id` = 4 LIMIT 21', 'time': '0.000'},
  33. # {'sql': 'SELECT `publisher`.`id`, `publisher`.`name` FROM `publisher` WHERE `publisher`.`id` = 3 LIMIT 21', 'time': '0.000'},
  34. # {'sql': 'SELECT `author`.`id`, `author`.`name`, `author`.`age`, `author`.`email` FROM `author` WHERE `author`.`id` = 3 LIMIT 21', 'time': '0.000'},
  35. # {'sql': 'SELECT `publisher`.`id`, `publisher`.`name` FROM `publisher` WHERE `publisher`.`id` = 2 LIMIT 21', 'time': '0.000'}]
  36. return HttpResponse("success!)

3.求2020所有图书的销售总额,示例代码如下:

  1. def index(request):
  2. # 3.求2020所有书的销售总额
  3. # 首先为BookOrder模型添加一个新的属性time,必须设置DateTimeField()中的参数null=True。因为bookorder表中已经含有多条数据了。新添加的这个属性,在数据库中字段为NULL.如果不设置null=True的话,默认情况下为False。
  4. book = BookOrder.objects.filter(time__year=2020).aggregate(sum=Sum('price'))
  5. print(book)
  6. # # {'sum': 522.0}
  7. print(connection.queries)
  8. # [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'},
  9. # {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'},
  10. # {'sql': "SELECT SUM(`book_order`.`price`) AS `sum` FROM `book_order` WHERE `book_order`.`time` BETWEEN '2020-01-01 00:00:00' AND '2020-12-31 23:59:59.999999'", 'time': '0.000'}]
  11. return HttpResponse('success!')

4.求2020年度每种书的销售总额,示例代码如下:

  1. from django.http import HttpResponse
  2. from djano.db import connection
  3. from django.db.models import Sum
  4. from .models import Book, BookOrder
  5. def index(request):
  6. # 4.求2020年度每种书的销售总额
  7. books = Book.objects.filter(bookorder__time__year=2020).annotate(sum=Sum('bookorder__price'))
  8. for book in books:
  9. print("%s,%s"%(book.name,book.sum))
  10. # 打印出结果:
  11. # 三国演义,203.0
  12. # 水浒传,115.0
  13. # 红楼梦,204.0
  14. print(connection.queries)
  15. # 打印出sql语句
  16. # [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'},
  17. # {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'},
  18. # {'sql': "SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, SUM(`book_order`.`price`) AS `sum` FROM `book` INNER JOIN `book_order` ON (`book`.`id` = `book_order`.`book_id`) WHERE `book_order`.`time` BETWEEN '2020-01-01 00:00:00' AND '2020-12-31 23:59:59.999999' GROUP BY `book`.`id` ORDER BY NULL", 'time': '0.000'}]
  19. return HttpResponse("success !")

75.Python中ORM聚合函数详解:Sum的更多相关文章

  1. 72.Python中ORM聚合函数详解:Avg,aggregate,annotate

    聚合函数: 如果你用原生SQL语句,则可以使用聚合函数提取数据.比如提取某个商品销售的数量,那么就可以使用Count,如果想要知道销售的平均价格,那么就可以使用Avg. 聚合函数是通过aggregat ...

  2. 73.Python中ORM聚合函数详解:Count

    Count:用来求某个数据的个数. 在以下所有的示例中所采用的模型为: from django.db import models # 定义作者模型 class Author(models.Model) ...

  3. 74.Python中ORM聚合函数详解:Max,Min

    Max和Min:获取指定对象的最大值和最小值. 1. 比如:想要获取Author表中的最大的年龄和最小的年龄.示例代码如下: from django.http import HttpResponse ...

  4. python中的 zip函数详解

    python中zip()函数用法举例 定义:zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple ...

  5. python中的buildin函数详解(第一篇)

    这会是很长的一个帖子,因为我打算从python最基础的东西开始,尝试去完全的掌握它,buildin中有一些常用的函数比如 abs, open, setattr, getattr, 大家都很了解他们的用 ...

  6. python中的builtin函数详解-第二篇

    classmethod(function) 这里不过多说明这个builtin方法的具体用法,python的文档和help函数已经给了这个方法充足的使用说明,所以我这里要说的时关于 classmetho ...

  7. Python中的getattr()函数详解

    最近看Dive into python第四章自省中提到getattr()函数,作为一个内建函数平时自己没怎么用过所以也不太理解这个函数的一些用法 看了下函数本身的doc getattr(object, ...

  8. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  9. Python中格式化format()方法详解

    Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...

随机推荐

  1. MySQL 之存储引擎与数据类型与数据约束

    一.存储引擎场景 1.InnoDB 用于事务处理应用程序,支持外键和行级锁.如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那 ...

  2. Python中property属性的概论和使用方法

    property属性 概念: 定义一个方法但是使用装饰器property,只可以有一个self形参 可以用这样的属性动态的获取属性的值 定义方式(经典类) class Fun(): @property ...

  3. NoSQL 是什么

    NoSQL 全称 Not only SQL ,是一种相对较新的数据库设计方式,传统的关系型数据库使用的是固定模式,并将数据分割在多个表中,然而,对于大数据集的情况,数据量太大使其难以存放在单一的服务器 ...

  4. Numpy 广播(Broadcast)

    广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行. 如果两个数组 a 和 b 形状相同,即满足a.shape == b ...

  5. iframe切换

    iframe(locator有三种情况,可以是:定位表达式(driver.find_element_by_xpath()),frame的名称,下标index) driver.switch_to.fra ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:边框表格

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:"text-warning" 类的文本样式

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. Linux系统chmod命令的含义和权限详解

    许多喜欢使用chmod命令的用户,对chmod命令的含义和权限仍然不是很清楚,因此在使用的时候对它们造成了一定的麻烦.为了解决这些用户的迷惑,今天小编就和大家一起分享下chmod命令的含义和权限. 对 ...

  9. Bootstrap入门(一)准备

    Bootstrap入门(一)准备         网页的样式化与布局展示是很多开发者要面对的问题,目前有多的框架和工具包,可以使网页设计的任务变得更加简单.轻松.方便.快捷一些,其中,bootstra ...

  10. Day2-I-Knight's Problem POJ - 3985

    You must have heard of the Knight's Tour problem. In that problem, a knight is placed on an empty ch ...