mirror of https://github.com/jumpserver/jumpserver
perf: group_stats
parent
e3c33bca32
commit
d3ec23ba85
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue