Вы можете использовать groupby
itertools:
<b>from django.db.models import F, Func
from itertools import groupby
from operator import itemgetter</b>
query = (Model.objects<b>.annotate(month=Func(F('created_at'), function='MONTH'))</b>
.filter(month__gte=3)
<b>.order_by('month')</b>
.values('student_id','month'))
result = {
m: [x['student_id'] for x in xs]
for m, xs in <b>groupby(query, itemgetter('month'))</b>
}
Таким образом, мы сначала генерируем запрос, в котором мы создаем аннотацию: мы аннотируем каждый экземпляр Model
с атрибутом month
, который являетсямесяц поля created_at
.
Далее мы фильтруем на основе того факта, что этот столбец month
больше или равен 3
, затем мы упорядочиваем набор запросов по этому month
(этоважно для функции groupby
, которая работает только в том случае, если элементы формируют группы на основе элемента, который мы хотим сгруппировать. Затем мы выполняем values(..)
, чтобы сделать запрос более эффективным.
Затем выполняем groupby(query, itemgetter('month'))
поэтому мы создаем куски элементов с одним и тем же месяцем. Это создает итерацию из 2 кортежей с m
номером месяца и xs
итерируемым из словарей, принадлежащих этой группе.
Мыпреобразовать эту итерацию таким образом в словарь, где m
отображается в список student_id
s.