将注释的值用作when()

时间:2018-08-16 10:45:03

标签: python django django-models django-views

我尝试在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时,它可以正常工作。

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()
        )