【发布时间】:2017-05-23 20:58:08
【问题描述】:
我正在尝试使用 Django 将值聚合到特定级别,但它似乎并不直截了当:聚合发生在完整的查询集或对象级别,而不是“中间”。
这是我的查询:我需要从多个事件条目中逐年计算总活动时间。
events.annotate( # Extracting the year
year = ExtractYear('dtstart')
).annotate( # Computing duration...
time_span= ExpressionWrapper(
F('dtend') - F('dtstart'),
output_field=IntegerField()
)
).values( # ... then aggregating by year
'year', 'time_span' #!!!! ... BUT ALSO unfortunately
# by 'time_span' !!!!!!!!!!!!!!!
).annotate( # otherwise 'time_span' would not
total_span=Sum('time_span') # be available for a new computation.
).values( # Therefore, the result is not
'year', 'total_span' # grouped by year, but by the
).order_by( # distinct combination of 'year'
'year' # AND 'total_span'
)
因此,我得到了这个结果:
<QuerySet [
{'total_span': 1800000000, 'year': 2016},
{'total_span': 7200000000, 'year': 2016},
{'total_span': 2700000000, 'year': 2016},
{'total_span': 14400000000, 'year': 2016},
{'total_span': 8100000000, 'year': 2017}, ...>
而不是这样的:
<QuerySet [
{'total_span': 16700000000, 'year': 2016},
{'total_span': 19800000000, 'year': 2017}, ...>
为了设置聚合级别,我需要类似的东西:
聚合(total_span=Sum('time_span'), group_by='year')
我想我应该转向子查询或自定义聚合类,但这超出了我的技能范围。任何提示将不胜感激...
【问题讨论】:
标签: python django aggregate annotate