Django QuerySet
有两种方法,annotate
和aggregate
。该文档说:
与gregation()不同,annotate()不是终端子句。annotate()子句的输出是QuerySet。
它们之间还有其他区别吗?如果没有,那为什么aggregate
存在呢?
Django QuerySet
有两种方法,annotate
和aggregate
。该文档说:
与gregation()不同,annotate()不是终端子句。annotate()子句的输出是QuerySet。
它们之间还有其他区别吗?如果没有,那为什么aggregate
存在呢?
Answers:
我将重点放在示例查询上,而不是您在文档中的引用。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
是书籍的查询集,但每本书都注明了作者人数。
connection.queries
。提示:检查是否book = q[0]
是导致查询的是“ book.num_authors”。
聚合 聚合在整个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')
在视图中:
videos = Video.objects.values('id', 'name','video').annotate(Count('user_likes',distinct=True)
在观看时,它将计算每个视频的点赞次数
distinct=True
在最后一个示例中需要?
.annotate()
仅在qs上就不会打到db,而是打到了q[0].num_authors
?我认为aggregate
必须总是打db,因为它是一个terminal子句?