aboutsummaryrefslogtreecommitdiff
path: root/db.py
blob: df9ceda10f6a46035c8fbfd63ee6b8f7e9423e47 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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