django 使用带注解的值作为when()中的值

vcudknz3  于 2023-10-21  发布在  Go
关注(0)|答案(2)|浏览(118)

我尝试在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'
        )

所以我试着把previous_somme和somme之间的进化百分比注解为“进化”。但是当前一个somme是0时,我不想做计算(因为除以零)。但似乎不可能在价值内部进行计算。我尝试直接使用“somme”和“previous_somme”,但它们没有被识别。
你有什么办法吗?谢谢
PS:其余的请求工作,当我把一个1的价值,它的工作正常。

xjreopfe

xjreopfe1#

我不太明白这个问题,但我认为将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()
        )
9rnv2umw

9rnv2umw2#

我遇到了同样的问题,并通过将整个ExpressionWrapper参数 Package 为then来解决它

from django.db.models import ExpressionWrapper, DecimalField
complex_expression = 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)
                        )
                    )

when = When(~Q(previous_somme=0),
            then=ExpressionWrapper(complex_expression, output_field=DecimalField())
        ),
        default=Value('N/A'),
        output_field=CharField()
    )

相关问题