Записи в группе Django по месяцам

Я просто пытаюсь сгруппировать записи в Data.active_objects, которые встречаются в одном и том же месяце и году. Я бы хотел, чтобы записи, разделяющие один и тот же месяц и год, были аннотированы количеством вхождений в Data.active_objects

Data.active_objects имеет несколько записей с одинаковыми значениями месяца в 'ts_create'

То, что я пробовал до сих пор, это

test = Data.active_objects.annotate(ts_create__count=Count(TruncMonth('ts_create), distinct=True)

Однако это не дает ожидаемых результатов, поскольку каждая запись в Data.active_objects имеет аннотированное значение 'ts_create__count' равное 1, даже если записи происходят в одном и том же месяце

Попробуйте это:

from django.db.models.functions import ExtractMonth, ExtractYear

test = Data.active_objects.annotate(year=ExtractYear('ts_create'),
                                month = ExtractMonth('ts_create')).values('year','month').annotate(total=Count('id'))

Вы можете использовать TruncMonth [Django-doc] для усечения ts_create до начала месяца, а затем аннотировать количество элементов с:

from django.db.models import Count
from django.db.models.functions import TruncMonth

Data.objects.values(
    month=TruncMonth('ts_create')
).annotate(
    count=Count('pk')
).order_by('month')

В результате будет получен QuerySet словарь с month и count в качестве ключей, например:

<QuerySet [
    {'month': date(2022, 1, 1), 'count': 14},
    {'month': date(2022, 2, 1), 'count': 25},
    {'month': date(2022, 3, 1), 'count': 13},
    {'month': date(2022, 4, 1), 'count': 2}
]>
Вернуться на верх