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):
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue