我正在使用聚合来获取一列 bool 值的计数。我想要真值的数量。
DJANGO 代码:
count = Model.objects.filter(id=pk).aggregate(bool_col=Count('my_bool_col')
这将返回所有行的计数。
SQL 查询应该是:
SELECT count(CASE WHEN my_bool_col THEN 1 ELSE null END) FROM <table_name>
这是我的实际代码:
stats = Team.objects.filter(id=team.id).aggregate(
goals=Sum('statistics__goals'),
assists=Sum('statistics__assists'),
min_penalty=Sum('statistics__minutes_of_penalty'),
balance=Sum('statistics__balance'),
gwg=Count('statistics__gwg'),
gk_goals_avg=Sum('statistics__gk_goals_avg'),
gk_shutout=Count('statistics__gk_shutout'),
points=Sum('statistics__points'),
)
感谢 Peter DeGlopper 建议使用 django-aggregate-if
解决方法如下:
from django.db.models import Sum
from django.db.models import Q
from aggregate_if import Count
stats = Team.objects.filter(id=team.id).aggregate(
goals=Sum('statistics__goals'),
assists=Sum('statistics__assists'),
balance=Sum('statistics__balance'),
min_penalty=Sum('statistics__minutes_of_penalty'),
gwg=Count('statistics__gwg', only=Q(statistics__gwg=True)),
gk_goals_avg=Sum('statistics__gk_goals_avg'),
gk_shutout=Count('statistics__gk_shutout', only=Q(statistics__gk_shutout=True)),
points=Sum('statistics__points'),
)
最佳答案
针对 Django 1.10 进行了更新。您现在可以执行条件聚合:
from django.db.models import Count, Case, When
query_set.aggregate(bool_col=Count(Case(When(my_bool_col=True, then=1))))
更多信息:
关于python - Django 聚合只计算真值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25250490/