一. 基本区别
aggregate
:返回使用聚合函数后的字段和值。annotate
:在原来模型字段的基础之上添加一个使用了聚合函数的字段
二. 使用方法
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 BookOrder(models.Model):
"""图书订单模型"""
book = models.ForeignKey("Book",on_delete=models.CASCADE)
price = models.FloatField()
class Author(models.Model):
"""作者模型"""
name = models.CharField(max_length=100)
age = models.IntegerField()
email = models.EmailField()
1.Avg
:求平均值。
比如想要获取所有图书的价格平均值
from django.db.models import Avg
result = Book.objects.aggregate(Avg('price'))
print(result)
输出为
{"price__avg":23}
其中price__avg
的结构是根据field__avg
规则构成的。如果想要修改默认的名字,那么可以将Avg
赋值给一个关键字参数。比如my_avg=Avg('price'),那么输出为
{"my_avg":23}
2.Count
:获取指定的对象的个数
比如想获得所有图书的数量
from django.db.models import Count
result = Book.objects.aggregate(book_num=Count('id'))
Count
类中,还有另外一个参数叫做distinct
,默认是等于False
,如果是等于True
,那么将去掉那些重复的值。比如要获取作者表中所有的不重复的邮箱总共有多少个,那么可以通过以下代码来实现:
from djang.db.models import Count
result = Author.objects.aggregate(count=Count('email',distinct=True))
3.Sum
:求指定对象的总和
比如要求图书的销售总额
from djang.db.models import Sum
result = Book.objects.annotate(total=Sum("bookorder__price")).values("name","total")
annotate
的意思是给Book
表在查询的时候添加一个字段叫做total
,这个字段的数据来源是从BookOrder
模型的price
的总和而来。values
方法是只提取name
和total
两个字段的值。
注意:Sum和Count的区别
count()函数里面的参数是列名的的时候,那么会计算有值项的次数,即使值为空字符串也会计算。
而sum里面的参数是列名的时候,是计算列名的值的相加
比如,把所有机构按在线设备数进行排序
机构(org)是设备(device_detail)的主键;设备在线值为"1", 不在线值为"0"
orgs = org.objects.annotate(online_num=Sum('device_detail__online')).order_by('-online_num')
这里如果用Sum,那么是按机构的在线设备数进行排序
如果用Count, 那么会按机构所拥有的总设备数进行排序
4.Max
和Min
:获取指定对象的最大值和最小值。
比如想要获取Author
表中,最大的年龄和最小的年龄分别是多少
from django.db.models import Max,Min
result = Author.objects.aggregate(Max('age'),Min('age'))
输出为
{"age__max":88,"age__min":18}
标签:Count,__,区别,models,price,annotate,Book,aggregate
From: https://www.cnblogs.com/regit/p/16944571.html