32 lines
914 B
Python
32 lines
914 B
Python
|
from collections import OrderedDict
|
||
|
|
||
|
from .utils import get_field_value
|
||
|
|
||
|
|
||
|
def group_by(qset, *fields):
|
||
|
""" 100% in python in order to preserve original order_by """
|
||
|
first = OrderedDict()
|
||
|
num = len(fields)
|
||
|
for obj in qset:
|
||
|
ix = 0
|
||
|
group = first
|
||
|
while ix < num:
|
||
|
try:
|
||
|
current = get_field_value(obj, fields[ix])
|
||
|
except AttributeError:
|
||
|
# Intermediary relation does not exists
|
||
|
current = None
|
||
|
if ix < num-1:
|
||
|
try:
|
||
|
group = group[current]
|
||
|
except KeyError:
|
||
|
group[current] = OrderedDict()
|
||
|
group = group[current]
|
||
|
else:
|
||
|
try:
|
||
|
group[current].append(obj)
|
||
|
except KeyError:
|
||
|
group[current] = [obj]
|
||
|
ix += 1
|
||
|
return first
|