Я пытаюсь использовать вычисленное значение с аннотированными полями в параметре «then» объекта When (). Django вызывает у меня ошибку:
can't adapt type 'CombinedExpression'
Вот мой код:
categories = Category.objects.filter(
Q(amount__card__date__range=(
start_day_compare,
stop_day_compare
)) | Q(amount__card__date__range=(
previous_start_day_compare,
previous_stop_day_compare
))
).annotate(
somme=Sum(
'amount__amount',
filter=Q(
amount__card__date__range=(
start_day_compare,
stop_day_compare
)
)
)
).annotate(
previous_somme=Sum(
'amount__amount',
filter=Q(
amount__card__date__range=(
previous_start_day_compare,
previous_stop_day_compare
)
)
)
).annotate(
evolution=Case(
When(
~Q(previous_somme=0),
then=Value(
(
(
Sum(
'amount__amount',
filter=Q(
amount__card__date__range=(
start_day_compare,
stop_day_compare
)
)
) - Sum(
'amount__amount',
filter=Q(
amount__card__date__range=(
previous_start_day_compare,
previous_stop_day_compare
)
)
)
) * 100
) / Sum(
'amount__amount',
filter=Q(
amount__card__date__range=(
previous_start_day_compare,
previous_stop_day_compare
)
)
)
)
),
default=Value('N/A'),
output_field=CharField()
)
).order_by(
'order'
)
Поэтому я пытаюсь обозначить как «эволюцию» процент эволюции между предыдущей_сомой и соммой. Но когда предыдущая сомма равна 0, я не хочу выполнять расчет (из-за деления на ноль). Но произвести расчет внутри Ценности кажется невозможным. Я пробовал использовать напрямую "somme" и "previous_somme", но они не пересматриваются.
У вас есть идея сделать это? Спасибо
PS: остальная часть запроса работает, когда я помещаю 1 в значение, он работает нормально.
🤔 А знаете ли вы, что...
Python поддерживает многозадачность и многопоточность.
Я не совсем понял вопрос, но я думаю, что изменение части When
на что-то вроде этого должно сработать:
When(
~Q(previous_somme=0),
then=(
((models.F('somme') - models.F('previous_somme')) * 100) / models.F('previous_somme')
)
),
default=Value('N/A'),
output_field=CharField()
)