Как применить оператор for для упрощения повторяющегося кода в Django queryset
Фильтр применяется в соответствии с параметром team_parameter(request.GET.get('team)) и имеет очень повторяющийся код. В конце оператора if фильтр не применяется, только если параметр team_parameter равен 'ALL'. Я думаю, что оператор for необходим для минимизации этого кода, но я не знал, как его применить, поэтому задал вопрос. Пожалуйста, сообщите мне, какие циклы необходимы для упрощения приведенного ниже кода. Помогите.
[views.py]
Вы можете определить списки аргументов и список аргументов ключевых слов перед if-функцией. И передать их в функции базы данных:
monthly_kwargs = {
'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-31')),
'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-31')),
'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-31')),
'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-31')),
'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-31')),
'dec': Count('client_id', filter=Q(enroll_date__gte='2022-12-01', enroll_date__lte='2022-12-31')),
}
value_list_args = ['uploader_id__first_name', 'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sept', 'oct','nov', 'dec']
И затем сделайте запросы следующим образом:
monthly_enroll = Feedback.objects\
.values('uploader_id__first_name').distinct()\
.order_by('uploader_id__first_name')\
.annotate(**monthly_kwargs)\
.values_list(*value_list_args)\
.order_by('uploader_id__first_name')