在当今根据需求而不断调整而成的应用程序中,通常不仅需要能依常规的字段,如字母顺序或创建日期,来对项目进行排序,还需要按其他某种动态数据对项目进行排序.Djngo聚合就能满足这些要求。
以下面的模型为例
django。数据库导入模型 类作者(models.Model): name=models.CharField (max_length=100) 年龄=models.IntegerField () 类的出版商(models.Model): name=models.CharField (max_length=300) num_awards=models.IntegerField () 类的书(models.Model): name=models.CharField (max_length=300) 页面=models.IntegerField () 价格=模型。DecimalField (max_digits=10, decimal_places=2) 评级=models.FloatField () 作者=models.ManyToManyField(作者) 出版商=models.ForeignKey(出版商)=models.DateField的作用是() 类商店(models.Model): name=models.CharField (max_length=300) 书=models.ManyToManyField(书) registered_users=models.PositiveIntegerField ()
<强>快速了解强>
#书总数量。 在在在Book.objects.count () 2452 #图书出版商=BaloneyPress总数 在在在Book.objects.filter (publisher__name=BaloneyPress) .count () 73 #书的平均价格。 在在在从django.db。模型导入Avg 在在在Book.objects.all () .aggregate (Avg(“价格”)) {“price__avg”: 34.35} #书的最大的价格。 在在在从django.db。模型导入马克斯 在在在Book.objects.all () .aggregate (Max(“价格”)) {“price__max”:小数(81.20)} #所有以下查询包括遍历Book<霭嫔? #多对多关系落后 #为每个出版商添加个num_books属性,即每个pulisher出版的书的数量。 在在在从django.db。模型导入数 在在在酒吧=Publisher.objects.annotate (num_books=Count(书的)) 在在在酒吧 [& lt;出版商BaloneyPress> & lt;出版商SalamiPress>,…] 在在在酒吧[0].num_books 73 #根据num_book属性排序。 在在在酒吧=Publisher.objects.annotate (num_books=Count('书')).order_by (-num_books) [5] 在在在酒吧[0].num_books 1323年
<强>聚合生成生成聚集在QuerySet
强>
Django有两种方法来生成聚合。第一种方法是为整个QuerySet生成聚合值,例如为全部的书生成价格的平均值:
在在在从django.db。模型导入Avg 在在在Book.objects.all () .aggregate (Avg(“价格”)) {“price__avg”: 34.35}
可以简略为:
在在在Book.objects.aggregate (Avg(“价格”)) {“price__avg”: 34.35}
函数合计()的参数是一系列聚合函数总体功能:
<强> Avg 强>
返回平均值
<强>数强>
<代码>类计数(领域、不同=False) 代码>
返回计数。当参数不同=True时,返回独特的对象数目。
<强> Max 强>
返回最大值
<强> Min 强>
返回最小值。
<强> StdDev 强>
<代码>类StdDev(字段,示例=False) 代码>
返回标准偏差
有一个参数样本
默认情况下样本=False,返回总体标准偏差,如果示例=True,返回样本标准偏差。
<强>和强>
返回总值
<强>方差强>
<代码>类方差(字段,示例=False) 代码>
返回方差
有一个参数样本,默认返回总体方差,样例设为True时返回样本方差。
总()方法被调用时,返回一个键值对字典,可以指定关键的名字:
在在在Book.objects.aggregate (average_price=Avg(“价格”)) {“average_price”: 34.35}
如果你想生成多个聚合,你只需要添加另一个参数,所以,如果我们还想知道所有书的最高和最低的价格:
在在在从django.db。模型导入Avg,最大值、最小值 在在在Book.objects.aggregate (Avg(的价格),马克斯(的价格),最小值(“价格”)) {“price__avg”: 34.35,“price__max”:小数(81.20)、“price__min”:小数(12.99)}
<强>为查询集的每个对象生成聚合值为每个项目生成聚集在QuerySet