Вы можете выполнить такой агрегат с помощью функции groupby
, равной itertools
.Требуется, чтобы элементы появлялись в виде «кусков» по отношению к «критериям группировщика».Но здесь дело обстоит так, поскольку вы используете order_by
.
Таким образом, мы можем записать его следующим образом:
<b>from itertools import groupby
from operator import itemgetter</b>
query = (Event.objects.all.select_related('event_type')
.order_by('date'<b>, 'event_type'</b>)
.distinct('date', 'event_type')
.values_list('date', 'event_type__name'))
result = [
{ 'date': k, 'datetypes': [v[1] for v in vs]}
for k, vs in <b>groupby(query, itemgetter(0))</b>
]
Вы также лучше используете 'event_type'
в порядке по критерию.
Это приведет к чему-то вроде:
[{'date': datetime.date(2018, 5, 19), 'datetypes': ['Famous person died',
'Royal wedding']},
{'date': datetime.date(2018, 5, 24), 'datetypes': ['Famous person died']},
{'date': datetime.date(2011, 5, 25), 'datetypes': ['Important law enforced',
'Referendum']}]
(на основе быстрого сканирования Википедии последних дней мая).
groupby
работает в линейном времени сколичество возвращаемых строк.