Как упростить избыточный код в Django queryset

Я хочу построить график количества регистраций клиентов в месяц/сотрудника за этот год. Приведенный ниже код используется для получения желаемого набора запросов, но в аннотациях есть много пересекающихся частей, поэтому я хочу свести этот код к минимуму. Кроме того, есть хлопоты, связанные с необходимостью менять год при каждом изменении года, поэтому я надеюсь, что эта проблема также будет решена.

(* Для справки, ось x - "месяц", ось y - "имя сотрудника" (uploader_id__first_name ))

[views.py]

monthly_enroll = Feedback.objects\
    .values('uploader_id__first_name').distinct().order_by('uploader_id__first_name')\
    .annotate(jan=Count('client_id', filter=Q(enroll_date__gte='2022-01-01', enroll_date__lte='2022-01-31')),
              feb=Count('client_id', filter=Q(enroll_date__gte='2022-02-01', enroll_date__lte='2022-02-28')),
              mar=Count('client_id', filter=Q(enroll_date__gte='2022-03-01', enroll_date__lte='2022-03-31')),
              apr=Count('client_id', filter=Q(enroll_date__gte='2022-04-01', enroll_date__lte='2022-04-30')),
              may=Count('client_id', filter=Q(enroll_date__gte='2022-05-01', enroll_date__lte='2022-05-31')),
              jun=Count('client_id', filter=Q(enroll_date__gte='2022-06-01', enroll_date__lte='2022-06-30')),
              jul=Count('client_id', filter=Q(enroll_date__gte='2022-07-01', enroll_date__lte='2022-07-31')),
              aug=Count('client_id', filter=Q(enroll_date__gte='2022-08-01', enroll_date__lte='2022-08-31')),
              sept=Count('client_id', filter=Q(enroll_date__gte='2022-09-01', enroll_date__lte='2022-09-30')),
              oct=Count('client_id', filter=Q(enroll_date__gte='2022-10-01', enroll_date__lte='2022-10-31')),
              nov=Count('client_id', filter=Q(enroll_date__gte='2022-11-01', enroll_date__lte='2022-11-30')),
              dec=Count('client_id', filter=Q(enroll_date__gte='2022-12-01', enroll_date__lte='2022-12-31')),)\
    .values_list('uploader_id__first_name', 'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sept', 'oct','nov', 'dec')\
    .order_by('uploader_id__first_name')
Вернуться на верх