annotate() and aggregate() for generically-related data.
Latest commit b127554 Jun 16, 2016 @coleifer committed on GitHub Merge pull request #8 from adamchainz/
Convert readthedocs links for their .org -> .io migration for hosted projects
Failed to load latest commit information.
docs Add history and bump version. Jan 22, 2016
AUTHORS update authors Jan 22, 2016
LICENSE Adding manifest Aug 7, 2010
README.rst Add comment. Jan 22, 2016



annotate() and aggregate() for generically-related data. also a handy function for filtering GFK-model querysets.

Use django's GenericRelation where possible, as this can make the queries generated more efficient by using a JOIN rather than a subquery.


# install from pypi
pip install django-generic-aggregation

# or install via git
pip install -e git+git://


The examples below assume the following simple models:

class Rating(models.Model):
    rating = models.IntegerField()
    object_id = models.IntegerField()
    content_type = models.ForeignKey(ContentType)
    content_object = GenericForeignKey(ct_field='content_type', fk_field='object_id')

class Food(models.Model):
    name = models.CharField(max_length=50)
    ratings = generic.GenericRelation(Rating) # reverse generic relation

You want to figure out which items are highest rated (generic_annotate)

from django.db.models import Avg

food_qs = Food.objects.filter(name__startswith='a')
generic_annotate(food_qs, Rating, Avg('ratings__rating'))

# you can mix and match queryset / model
generic_annotate(food_qs, Rating.objects.all(), Avg('ratings__rating'))

You want the average rating for all foods that start with 'a' (generic_aggregate)

food_qs = Food.objects.filter(name__startswith='a')
generic_aggregate(food_qs, Rating, Avg('ratings__rating'))

You want to only display ratings for foods that start with 'a' (generic_filter)

food_qs = Food.objects.filter(name__startswith='a') generic_filter(Rating.objects.all(), food_qs)