Aggregat
Aggregat generiert Ergebniswerte (Zusammenfassung) über ein gesamtes QuerySet. Aggregate arbeiten über das Rowset, um einen einzelnen Wert aus dem Rowset zu erhalten (z. B. Summe aller Preise im Rowset). Das Aggregat wird auf das gesamte QuerySet angewendet und generiert Ergebniswerte (Zusammenfassung) über das gesamte QuerySet.
Im Modell:
class Books(models.Model):
name = models.CharField(max_length=100)
pages = models.IntegerField()
price = models.DecimalField(max_digits=5, decimal_places=3)
In Shell:
>>> Books.objects.all().aggregate(Avg('price'))
# Above code will give the Average of the price Column
>>> {'price__avg': 34.35}
Annotate
Annotate generiert eine unabhängige Zusammenfassung für jedes Objekt in einem QuerySet. (Wir können sagen, dass jedes Objekt in einem QuerySet iteriert und eine Operation angewendet wird.)
Im Modell:
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')
Im Hinblick auf:
videos = Video.objects.values('id', 'name','video').annotate(Count('user_likes',distinct=True)
In der Ansicht werden die Likes für jedes Video gezählt
.annotate()
auf einem qs allein die Datenbank nicht getroffen wird, aber das Aufrufenq[0].num_authors
? Ich nehme anaggregate
muss immer die db treffen da es sich um eine terminalklausel handelt?