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):
pk_name = queryset.model._meta.pk.name
base = (
queryset.order_by()
grouped = (
queryset
.exclude(**{f"{key}__isnull": True})
.annotate(**{alias: F(key)})
.values(pk_name, alias)
.distinct()
.values(alias)
.order_by(alias)
.annotate(total=Count(1))
)
grouped = base.values(alias).annotate(total=Count(pk_name))
data = [
{
alias: val,
'total': cnt,
**({'label': label_map.get(val, val)} if label_map else {})
alias: g[alias],
'total': g['total'],
**({'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