072:【Django数据库】ORM聚合函数详解-aggregate和annotate

ORM聚合函数详解-aggregate和annotate:

aggregate和annotate的区别:

1、aggregate :返回使用聚合函数后的字段和值。
2、annotate :在原来模型字段的基础之上添加一个使用了聚合函数的字段,并且在使用聚合函数的时候,会使用当前这个模型的主键进行分组(group by)。比如以上 Sum 的例子,如果使用的是 annotate ,那么将在每条图书的数据上都添加一个字段叫做 total ,计算这本书的销售总额。而如果使用的是 aggregate ,那么将求所有图书的销售总额。

下面是需求是(基于上节课程情况),求每本书多少钱卖出去的:

def index(request):
    result = Book.objects.annotate(avg=Avg("bookorder__price"))
    print(result)
    for item in result:
        print(item.name, ":", item.avg)
    print(result.query)
    return HttpResponse("success")

结果是:

<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>]>
三国演义 : 89.33333333333333
水浒传 : 93.5
西游记 : None
红楼梦 : None
SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, AVG(`book_order`.`price`) AS `avg` FROM `book` LEFT OUTER JOIN `book_order` ON (`book`.`id` = `book_order`.`book_id`) GROUP BY `book`.`id` ORDER BY NULL

实例截图如下:

原文地址:https://www.cnblogs.com/zheng-weimin/p/10246685.html

时间: 2024-11-08 18:01:01

072:【Django数据库】ORM聚合函数详解-aggregate和annotate的相关文章

070:【Django数据库】ORM聚合函数详解-准备工作

ORM聚合函数详解-准备工作: 如果你用原生SQL,则可以使用聚合函数来提取数据.比如提取某个商品销售的数量,那么可以使用count,如果想要知道商品销售的平均价格,那么可以使用avg.聚合函数是通过aggregate方法来实现的.在讲解这些聚合函数的用法的时候,都是基于以下的模型对象来实现的. 创建如下models: from django.db import models class Author(models.Model): """作者模型""&qu

071:【Django数据库】ORM聚合函数详解-Avg

ORM聚合函数详解-Avg: Avg:求平均值.比如想要获取所有图书的价格平均值.那么可以使用以下代码实现: from django.db.models import Avg result = Book.objects.aggregate(Avg('price')) print(result) 以上的打印结果是: {"price__avg":23.0} 其中price__avg的结构是根据field__avg规则构成的.如果想要修改默认的名字,那么可以将Avg赋值给一个关键字参数.示例

075: 【Django数据库】ORM聚合函数详解-Sum

ORM聚合函数详解-Sum: Sum :求指定对象的总和.比如要求图书的销售总额.那么可以使用以下代码实现: from djang.db.models import Sum result = Book.objects.annotate(total=Sum("bookstore__price")).values("name","total") 以上的代码 annotate 的意思是给 Book 表在查询的时候添加一个字段叫做 total ,这个字段

076:【Django数据库】F表达式详解

F表达式详解: F表达式 是用来优化 ORM 操作数据库的.比如我们要将公司所有员工的薪水都增加1000元,如果按照正常的流程,应该是先从数据库中提取所有的员工工资到Python内存中,然后使用Python代码在员工工资的基础之上增加1000元,最后再保存到数据库中.这里面涉及的流程就是,首先从数据库中提取数据到Python内存中,然后在Python内存中做完运算,之后再保存到数据库中.示例代码如下: employees = Employee.objects.all() for employee

079:【Django数据库】QuerySet API详解-filter、exclude、annotate

QuerySet API详解-filter.exclude.annotate: 在使用 QuerySet 进行查找操作的时候,可以提供多种操作.比如过滤完后还要根据某个字段进行排序,那么这一系列的操作我们可以通过一个非常流畅的 链式调用 的方式进行.比如要从文章表中获取标题为 123 ,并且提取后要将结果根据发布的时间进行排序,那么可以使用以下方式来完成: articles = Article.objects.filter(title='123').order_by('create_time')

080:【Django数据库】QuerySet API详解-order_by:

QuerySet API详解-order_by: order_by:指定将查询的结果根据某个字段进行排序.如果要倒叙排序,那么可以在这个字段的前面加一个负号.示例代码如下: # 时间从前往回排: # orders = BookOrder.objects.order_by("create_time") # 时间从后往前排(与上面相反): orders = BookOrder.objects.order_by("-create_time") # 时间从后往前排,如果时间

django ORM聚合函数

在Django中,聚合函数是通过aggregate方法实现的,aggregate方法返回的结果是一个字典 在使用时需要先导入模块from django.db.models import Count,Avg,Max,Min,Sum 假设有一个模型 class Book(models.Model): name = models.CharField(max_length=100) pages = models.IntegerField() price = models.FloatField() aut

django的crsf机制防御详解及在前后端分离中post数据到django-vue

django的crsf机制防御详解及在前后端分离中post数据到django 更新于: 2018-07-28 |  分类于 django CSRF(Cross Site Request Forgery) 跨站点伪造请求 某个用户已经登陆了你的网站,另外有一个恶意的网站有一个指向你网站的链接,那么当用户点击这个链接时,就会请求你的网站,但是你的网站以为是用户发来的请求,这时恶意网站就得逞了. django的应对措施 用户在post请求时,发送给用户一个token,然后在django内部实现了一个校

php socket函数详解

转自:http://blog.163.com/[email protected]/blog/static/2889641420138213514298/ 最近在用socket实现服务端向客户端主动推送消息函数名 描述socket_accept() 接受一个Socket连接socket_bind() 把socket绑定在一个IP地址和端口上socket_clear_error() 清除socket的错误或最后的错误代码socket_close() 关闭一个socket资源socket_connec