Django的注释和聚合方法之间的区别?

Django的QuerySet有两种方法, annotateaggregate 。 该文件说:

与aggregate()不同,annotate()不是一个terminal子句。 annotate()子句的输出是一个QuerySet。

他们之间有没有其他区别? 如果不是,那么为什么aggregate存在?

我会专注于示例查询,而不是文档中的引用。 Aggregate计算整个查询 Aggregate值。 Annotate计算查询集中每个项目的汇总值。

聚合

 >>> Book.objects.aggregate(average_price=Avg('price')) {'average_price': 34.35} 

返回包含查询集中所有图书的平均价格的字典。

注解

 >>> q = Book.objects.annotate(num_authors=Count('authors')) >>> q[0].num_authors 2 >>> q[1].num_authors 1 

q是书籍的查询集,但是每本书都被注释了作者的数量。

这是主要的区别,但是聚合也比注释更大。 注解本质上与查询集中的单个项目相关。 如果你在多对多的字段上运行一个Count注解,你将得到每个queryset成员的一个单独的计数(作为一个附加属性)。 但是,如果要对聚合执行相同的操作,它将尝试统计每个查询集的每个成员的每个关系,甚至重复,并将其作为一个值返回。

Aggregate Aggregate在整个QuerySet上生成结果(摘要)值。 集合对行集合进行操作以从行集合中获取单个值(例如,行集合中所有价格的总和)。 聚合应用于整个QuerySet,并在整个QuerySet上生成结果(摘要)值。

在模型中:

 `class Books(models.Model): name = models.CharField(max_length=100) pages = models.IntegerField() price = models.DecimalField(max_digits=5, decimal_places=3) 

在shell中:

 >>> Books.objects.all().aggregate(Avg('price')) # Above code will give the Average of the price Column >>> {'price__avg': 34.35} ` 

Annotate Annotate为QuerySet中的每个对象生成一个独立的摘要(我们可以说它在QuerySet中迭代每个对象并应用操作)

在模型中:

 class Video(models.Model): name = models.CharField(max_length=52, verbose_name='Name') video = models.FileField(upload_to=document_path, verbose_name='Upload video') created_by = models.ForeignKey(User, verbose_name='Created by', related_name="create_%(class)s") user_likes = models.ManyToManyField(UserProfile, null=True, blank=True, help_text='User can like once', verbose_name='Like by') 

In view

video = Video.objects.values('id','name','video')。annotate(Count('user_likes',distinct = True)

`**鉴于它会计数每个video的喜欢,**