Aggregate
Aggregate, tüm bir QuerySet üzerinden sonuç (özet) değerleri üretir. Agrega, satır kümesinden tek bir değer elde etmek için satır kümesi üzerinde çalışır. (Örneğin, satır kümesindeki tüm fiyatların toplamı). Toplama, tüm QuerySet'e uygulanır ve bir QuerySet'in tamamında sonuç (özet) değerleri oluşturur.
Modelde:
class Books(models.Model):
name = models.CharField(max_length=100)
pages = models.IntegerField()
price = models.DecimalField(max_digits=5, decimal_places=3)
Kabukta:
>>> Books.objects.all().aggregate(Avg('price'))
# Above code will give the Average of the price Column
>>> {'price__avg': 34.35}
Annotate
Annotate, bir QuerySet'teki her nesne için bağımsız bir özet oluşturur. (Her nesneyi bir QuerySet'te yinelediğini ve işlemi uyguladığını söyleyebiliriz)
Modelde:
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')
Görünümünde:
videos = Video.objects.values('id', 'name','video').annotate(Count('user_likes',distinct=True)
Görünümde, her videonun beğenilerini sayacak
.annotate()
Bir qs üzerinde tek başına db'yi vurmadığı, ancak aramanın işe yaradığı konusunda doğru muyumq[0].num_authors
?aggregate
Bir terminal cümlesi olduğu için her zaman db'ye basmanız gerektiğini varsayıyorum ?