【问题标题】:Key Error after multiple annotations with Django使用 Django 进行多个注释后的关键错误
【发布时间】: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])
  1. 它对组进行排序:

.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


【解决方案1】:

我认为您的问题是您没有向下传播带注释的值。你能用value_list看看它是否能解决你的问题吗?

queryset = queryset.annotate(total_value=target_dict[target])


data = queryset.annotate(group_by=Trunc("timestamp", group_by, output_field=DateField())) \
           .values_list("group_by", "total_value")

【讨论】:

  • Trunc 正常工作之前 lost_stake 的注释。在 Trunc 之后,lost_stake 注释似乎显示了一个关键错误。
  • 我想这就是问题所在。你能把.annotate(total_value=target_dict[target])放在values("group_by")上面吗
  • 我使用values("group_by")将数据按天、月或年分组,然后应用.annotate(total_value=target_dict[target])
  • 您使用的是values,它只返回那些被提及的字典,因此您的其他参数正在被过滤。你能把它分成两部分并确认它。我正在更新我的答案,看看
  • 令人困惑的是,利润和其他原始模型字段,即不是注释的字段,根本没有任何问题。
猜你喜欢
  • 1970-01-01
  • 2016-06-17
  • 2015-10-22
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多