django - 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 时会引发此错误。
非常感谢你的帮助
解决方案
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'
)
推荐阅读
- c++ - sf::Text 不显示?
- mariadb - 无法在 Mariadb 中使用函数调用添加约束检查
- javascript - 条码阅读器扫描的不可读条码
- nginx - Nginx 代理覆盖默认 HTML 文件
- r - 如何正确地将带引号的字符串作为 URL 输入的一部分传递给 httr:GET()?
- python-2.7 - 如何使用 python 2.7 将图像上传到谷歌云存储
- symfony - Symfony 4 - 将 attr 设置为实体类型
- html - 在一行中显示 div 元素
- dokuwiki - Dokuwiki ExtensionManager:“扩展目录不可写”
- bash - 返回命令的 pid 而不是返回 tee pid