From d3ec23ba8501148db8053408e0adfcd296875d23 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Thu, 14 Aug 2025 11:38:57 +0800 Subject: [PATCH] perf: group_stats --- apps/reports/api/assets/base.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/apps/reports/api/assets/base.py b/apps/reports/api/assets/base.py index 277e86a82..efd902184 100644 --- a/apps/reports/api/assets/base.py +++ b/apps/reports/api/assets/base.py @@ -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