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

Django 的 QuerySet有两种方法,annotateaggregate:

注释()不同于聚合() ,它不是一个终端子句,它的输出是一个 QuerySet。

它们之间还有什么区别吗? 如果没有,那为什么 aggregate还存在?

54660 次浏览

这是最主要的区别,但是聚合比注释的规模更大。注释本质上与查询集中的各个项相关。如果您在诸如多对多字段之类的东西上运行 Count注释,您将获得查询集中每个成员的单独计数(作为添加的属性)。但是,如果对聚合执行同样的操作,它将尝试计算查询集的 每个成员上的每个关系,甚至是重复的关系,并将其作为一个值返回。

我将重点关注示例查询,而不是您从文档中引用的内容。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是图书的查询集,但是每本书都注释了作者的数量。

总数 在整个 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)

在壳牌:

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

注释为 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')

视角:

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

在视图中,它将计算每个视频的喜欢