gpt4 book ai didi

Django 聚合 - 零值除法

转载 作者:行者123 更新时间:2023-12-04 03:19:38 28 4
gpt4 key购买 nike

我正在使用 Django 的 aggregate query expression总计一些值。最终值是一个除法表达式,有时可能以零作为分母。如果是这种情况,我需要一种方法来逃避,以便它只返回 0。

我尝试了以下方法,因为我一直在使用类似的注释表达式:

from django.db.models import Sum, F, FloatField, Case, When

def for_period(self, start_date, end_date):
return self.model.objects.filter(
date__range=(start_date, end_date)
).aggregate(
sales=Sum(F("value")),
purchase_cogs=Sum(F('purchase_cogs')),
direct_cogs=Sum(F("direct_cogs")),
profit=Sum(F('profit'))
).aggregate(
margin=Case(
When(sales=0, then=0),
default=(Sum(F('profit')) / Sum(F('value')))*100
)
)

但是,它显然不起作用,因为正如错误所说:

'dict' object has no attribute 'aggregate'



处理这个问题的正确方法是什么?

最佳答案

这显然行不通;因为 aggregate返回一个字典,而不是一个 QuerySet(见 docs),所以你不能链接两个 aggregate一起打电话。

我想使用 annotate 将解决您的问题。 annotate几乎与 aggregate 相同,除了它返回一个 QuerySet 并将结果保存为属性而不是返回一个字典。结果是你可以链接annotate调用,甚至调用 annotate然后 aggregate .

所以我相信这样的事情:

return self.model.objects.filter(
date__range=(start_date, end_date)
).annotate( # call `annotate`
sales=Sum(F("value")),
purchase_cogs=Sum(F('purchase_cogs')),
direct_cogs=Sum(F("direct_cogs")),
profit=Sum(F('profit'))
).aggregate( # then `aggregate`
margin=Case(
When(sales=0, then=0),
default=(Sum(F('profit')) / Sum(F('value')))*100
)
)

应该管用。

希望这可以帮助。

关于Django 聚合 - 零值除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39374050/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com