Django 数据库抽象 API 描述了如何创建、检索、更新和删除独立的对象。但是,有时你会需要处理一些有关对象的集合的统计。本文描述如何使用 Django 查询来处理统计。
本文我们将使用以下模型。这些模型用于在线书店图书清单:
classAuthor(models.Model):
name= models.CharField(max_length=100)
age=models.IntegerField()
friends= models.ManyToManyField('self', blank=True)classPublisher(models.Model):
name= models.CharField(max_length=300)
num_awards=models.IntegerField()classBook(models.Model):
isbn= models.CharField(max_length=9)
name= models.CharField(max_length=300)
pages=models.IntegerField()
price= models.DecimalField(max_digits=10, decimal_places=2)
rating=models.FloatField()
authors=models.ManyToManyField(Author)
publisher=models.ForeignKey(Publisher)
pubdate=models.DateField()classStore(models.Model):
name= models.CharField(max_length=300)
books=models.ManyToManyField(Book)
生成整个查询集的统计
Django 提供两种方法来产生统计。
第一种方法是产生整个 查询集 的统计。假设我们要统计所有书的平均价格。 Djnago 中查询所有书的语句为:
>>> Book.objects.all()
在这个语句后加上一个 aggregate() 子句就行了:
>>> from django.db.models import Avg
>>> Book.objects.all().aggregate(Avg('price'))
{'price__avg': 34.35}
上例中的 all() 是多余的。所以可以简写为:
>>> Book.objects.aggregate(Avg('price'))
{'price__avg': 34.35}
aggregat