perf: group_stats

pull/15846/head
feng 2025-08-14 11:38:57 +08:00 committed by ZhaoJiSen
parent e3c33bca32
commit d3ec23ba85
1 changed files with 9 additions and 12 deletions

View File

@ -2,24 +2,21 @@ from django.db.models import Count, F
def group_stats(queryset, alias, key, label_map=None): def group_stats(queryset, alias, key, label_map=None):
pk_name = queryset.model._meta.pk.name grouped = (
queryset
base = (
queryset.order_by()
.exclude(**{f"{key}__isnull": True}) .exclude(**{f"{key}__isnull": True})
.annotate(**{alias: F(key)}) .annotate(**{alias: F(key)})
.values(pk_name, alias) .values(alias)
.distinct() .order_by(alias)
.annotate(total=Count(1))
) )
grouped = base.values(alias).annotate(total=Count(pk_name))
data = [ data = [
{ {
alias: val, alias: g[alias],
'total': cnt, 'total': g['total'],
**({'label': label_map.get(val, val)} if label_map else {}) **({'label': label_map.get(g[alias], g[alias])} if label_map else {})
} }
for val, cnt in grouped.values_list(alias, 'total') for g in grouped
] ]
return data return data