我正在尝试使用一个巨大的请求来最大程度地减少应用程序中的请求数量。 在我的数据库中,我有一些卡,每张卡都有多个金额链接到该卡,每个金额都链接到一个类别。 我尝试获取两个日期之间的类别的金额总和,以及之前两个日期相同的事物(日期在卡片中),将它们进行比较并得出百分比演变。 在所有情况下,所有情况都可以正常运行,但只有一种情况:如果上一期间某个类别的总和为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时,会引发此错误。
非常感谢您的帮助
答案 0 :(得分:1)
When
的条件仅限于某些查找或Q-比较Sum结果与integer都不是,这就是为什么您遇到此错误的原因。
除非您提供模型和一些示例数据,否则我无法进行测试,但我认为以下方法可能会起作用:
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'
)