【发布时间】:2019-01-25 16:55:30
【问题描述】:
我正在尝试为我的模型计算一些统计数据。为此,我创建了一些注释来帮助我做到这一点:
# won
won_statuses = ["Won", "Half Won", "Cash Out"]
queryset = queryset.annotate(won=Case(When(status__name__in=won_statuses, then=1), default=0.0, output_field=DecimalField()))
# lost
lost_statuses = ["Lost", "Half Lost"]
queryset = queryset.annotate(lost=Case(When(status__name__in=lost_statuses, then=1), default=0.0, output_field=DecimalField()))
# lost_stake
queryset = queryset.annotate(lost_stake=F("lost") * F("stake"))
之后,我按日、月或年对数据进行分组,并应用将计算统计数据的注释:
target_dict = {"profit": Sum("profit"),
"stake": Sum("stake"),
"returns": Sum("returns"),
"yield": Sum("profit") / Sum("stake"),
"roi": Sum("returns") / Sum("stake"),
"hitrate": Avg("won"),
"count": Count("id")}
target = "profit"
group_by = "year"
data = queryset.annotate(group_by=Trunc("timestamp", group_by, output_field=DateField())) \
.values("group_by") \
.annotate(total_value=target_dict[target]) \
.order_by("group_by") \
.values_list("group_by", "total_value")
问题是每个涉及自定义注释(won、lost、lost_stakes)的计算都会向我显示一个关键错误:.annotate(total_value=Avg("won"))
模型中的所有字段都被正确计算。
当我使用 Trunc 进行注释时,不应该包含自定义注释 won、lost、lost_stake 吗?
如果我理解正确的话:
1.通过将日期截断到适当的重要组成部分(日、月、年)来添加字段:
.annotate(group_by=Trunc("timestamp", group_by, output_field=DateField()))
2.按 group_by 值对值进行分组:
.values("group_by")
3.计算为每个组提供(total_value=....)的函数:
.annotate(total_value=target_dict[target])
- 它对组进行排序:
.order_by("group_by")
5.返回一个包含所选字段的列表:
.values_list("group_by", "total_value")
我是不是误会了什么?
【问题讨论】:
-
那么
target是什么? L看起来不是利润,股份等。 -
这个错误很像
.annotate(total_value=target_dict[target])中的target_dict[target]引发的错误,所以这意味着注释永远不会在这里控制。可能tarket因此有一个 invalid 键。 -
我为 target 和 group_by 添加了示例值。 .
annotate(group_by=Trunc("timestamp", group_by, output_field=DateField())) \ .values("group_by")不应该包含之前计算的注解吗?
标签: django