from django.db.models import Manager from django.db.models.query import QuerySet from django.db.models.sql.query import Query class GroupedQuery(Query): def add_grouping(self, *grouping): if self.group_by is None: self.group_by = [] if isinstance(self.group_by, list): self.group_by.extend(grouping) def clear_grouping(self): self.group_by = None class GroupedQuerySet(QuerySet): def __init__(self, model=None, query=None, using=None, hints=None): super(GroupedQuerySet, self).__init__(model, query, using, hints) self.query = query or GroupedQuery(self.model) def group_by(self, *field_names): obj = self._clone() obj.query.clear_grouping() obj.query.add_grouping(*field_names) return obj class GroupedManager(Manager): def __init__(self): super(GroupedManager, self).__init__() self._queryset_class = GroupedQuerySet