use*_*717 12 python django orm
使用django的ORM annotate()和/或aggregate():我想根据一个类别字段求和,然后对每个日期的类别值进行平均.我尝试使用两个annotate()语句但是得到了一个FieldError.
我这样做:
queryset1 = self.data.values('date', 'category').annotate(sum_for_field=Sum('category'))
Run Code Online (Sandbox Code Playgroud)
哪个输出一个ValuesQuerySet对象的东西(所以类别的每个值的总和):
[{'category': 'apples', 'date': '2015-10-12', sum_for_field=2000},
{'category': 'carrots', 'date': '2015-10-12', sum_for_field=5000},
{'category': 'apples', 'date': '2015-10-13', sum_for_field=3000},
{'category': 'carrots', 'date': '2015-10-13', sum_for_field=6000}, ...
]
Run Code Online (Sandbox Code Playgroud)
然后我想平均每个日期的sum_for_field字段输出如下内容:
[ {'date': '2015-10-12', avg_final: 3500},
{'date': '2015-10-13', avg_final: 4500}, ...
]
Run Code Online (Sandbox Code Playgroud)
我试过这样做:
queryset2 = queryset1.values('date', 'sum_for_field')
result = queryset2.annotate(avg_final=Avg('sum_for_field'))
Run Code Online (Sandbox Code Playgroud)
但我得到了这个FieldError:
FieldError: FieldError: Cannot compute Avg('sum_for_field'): 'sum_for_field' is an aggregate
Run Code Online (Sandbox Code Playgroud)
从许多按组聚合的注释中按组聚合注释通常是一个复杂的问题,但AvgfromSum是一个特殊得多的情况。
表达式Avg('sum_for_field') 可以被评估,因为Sum('sum_for_field') / Count('category', distinct=True)它可以被Aggregate() 表达式评估。该Sum('sum_for_field')等于Sum('amount')。
解决方案:(预期名称:模型Data具有字段date, category, amount。)
qs = Data.objects.values('date').annotate(
avg_final=Sum('amount') / Count('category', distinct=True)
)
Run Code Online (Sandbox Code Playgroud)
(我确信非常相似的问题在当前的 Django 1.11 中没有任何解决方案,即使使用 Subquery 类,不使用奇怪的 extra() 方法和原始 SQL)