Django模型融合
今天学习了一下Django模型的聚合,特此总结。
聚合,意思就是对某一特定对象或者某些对象进行特定数据的融合,统计。说白了就是把一堆value统计起来。
聚合(Aggregation)主要分为两种:
- 对一整个查询集进行融合,英文aggregates over a
QuerySet;
对查询集的每一个对象进行融合。
aggregates for each item in aQuerySet
第一种,我们得到了一个QuerySet,然后统计一些字段的相关信息。主要方法是aggrevate。
class Book(models.Model):
name = models.CharField(max_length=300)
pages = models.IntegerField()
price = models.DecimalField(max_digits=10, decimal_places=2)
>>> from django.db.models import Max
>>> Book.objects.all().aggregate(Max('price'))
{'price__max': Decimal('81.20')}
>>> Book.objects.aggregate(average_price=Avg('price'))
{'average_price': 34.35}
看到上面返回的结果,就知道aggrevate返回的是一个字典,这对于QuerySet来说就是一个终止句,意思是后面不能再用任何QuerySet的方法了,因为它已经不是QuerySet的了,只是一个普通的Python字典。
除了Avg,还有Min,Max等等方法。
第二种, 我们想对查询集的每一个对象都做聚合,那就要用另外一张方法annotate。什么场景会用到它呢?比如,我现在有一周的工作信息数据,我想要每天的工作信息有多少个。这时就可以用到它了。
先拿一个官网的例子来说:
# Build an annotated queryset
>>> from django.db.models import Count
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
class Book(models.Model):
authors = models.ManyToManyField(Author)
q = Book.objects.annotate(Count('authors'))
这个例子是统计每一本书出现的作者有多少。
annotate中还有一种是可以根据某一字段进行分组,进行融合。比如我上面说一周工作信息的例子,要按日期分组:
class Job(models.Model):
load_day = models.DateField()
...................
>>> q = Job.objects.values('load_day').annotate(Count('load_day')).order_by()
通过使用values,会根据load_day字段进行分组,即会对同一天的数据进行统计,统计每天的工作信息总数。这里values和annotate的顺序必须得注意,values在前和在后的意义完全不一样。必须在前。
此外,在上个例子中,我们也看到了,annotate后还跟了一个QuerySet的方法,这也就意味着annotate和aggrevate不同,它不是一个终止句,仍然返回一个QuerySet。
更多的用法可参考官网:Aggregation
微信分享/微信扫码阅读