我尝试在When()的“ then”参数中使用带注释字段的计算值。 Django向我提出一个错误:
不能适应类型'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'
)
因此,我尝试将“ fore_somme”和“ somme”之间的某个百分比的演变注释为“进化”。但是,当先前的somme为0时,我就不想进行计算(因为被零除)。 但是似乎无法在Value中进行计算。我尝试直接使用“ somme”和“ previous_somme”,但未对其进行调和。
您有想法吗? 谢谢
PS:其余的请求有效,当我在Value中放入1时,它可以正常工作。
答案 0 :(得分:1)
我不太理解这个问题,但是我认为将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()
)