首页 > 解决方案 > Django When() 过滤引发错误

问题描述

我正在尝试使用巨大的请求来最小化我的应用程序中的请求数量。在我的数据库中,我有一些卡片,每张卡片都有多个金额链接,每个金额都链接到一个类别。我尝试获取 2 个日期之间的类别的金额总和,以及前 2 个日期的相同事物(日期在卡片中)比较它们并获得百分比演变。除了一种情况外,所有情况都可以正常工作:如果我在上一期间的某个类别的总和为 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 时会引发此错误。

非常感谢你的帮助

标签: djangodjango-modelsdjango-views

解决方案


When条件仅限于某些查找或 Q - 将 Sum 结果与整数进行比较两者都不是,这就是您遇到此错误的原因。

除非您提供模型和一些示例数据,否则我无法对其进行测试,但我认为以下方法可能有效:

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

推荐阅读