Django中的Case()返回类型错误

时间:2018-08-07 11:26:29

标签: python django django-models django-views

我正在尝试使用一个巨大的请求来最大程度地减少应用程序中的请求数量。 在我的数据库中,我有一些卡,每张卡都有多个金额链接到该卡,每个金额都链接到一个类别。 我尝试获取两个日期之间的类别的金额总和,以及之前两个日期相同的事物(日期在卡片中),将它们进行比较并得出百分比演变。 在所有情况下,所有情况都可以正常运行,但只有一种情况:如果上一期间某个类别的总和为0,则在尝试计算演变时会出现错误“除以0”。

因此,仅在上一期间的总和为!= 0时,我才尝试获取演化,如果= 0,则返回'N / A'。为此,我使用Case(When())。但是我有一个错误,我不确定为什么。

这是我的要求:

        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(
            evolution=Case(
                When(
                    Sum(
                        'amount__amount',
                        filter=Q(
                            amount__card__date__range=(
                                previous_start_day_compare,
                                previous_stop_day_compare
                            )
                        )
                    ) != 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'
        )

这是错误:

  

init ()将Q对象或查找作为关键字参数

当我上次使用previous_stop_day_compare时,会引发此错误。

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您已将参数放到CaseWhen上。

解决方案

Case(
    When(
        Sum(
            'amount__amount',
            filter=Q(
                amount__card__date__range=(
                    previous_start_day_compare,
                    previous_stop_day_compare
                )
            )
        ) != 0, # `Sum` ends here
        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
                    )
                )
            )
        ) # `Value` ends here
    ), # `When` ends here
    default=Value('N/A'),
    output_field=CharField()
)