Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django - Query count of each distinct status

I have a model Model that has Model.status field. The status field can be of value draft, active or cancelled.

Is it possible to get a count of all objects based on their status? I would prefer to do that in one query instead of this:

Model.objects.filter(status='draft').count()
Model.objects.filter(status='active').count()
Model.objects.filter(status='cancelled').count()

I think that aggregate could help.

like image 244
Milano Avatar asked Oct 19 '25 13:10

Milano


1 Answers

Yes, you can work with:

from django.db.models import Count

Model.objects.values('status').annotate(
    count=Count('pk')
).order_by('count')

This will return a QuerSet of dictionaries:

<QuerySet [
    {'status': 'active', 'count': 25 },
    {'status': 'cancelled', 'count': 14 },
    {'status': 'draft', 'count': 13 }
]>

This will however not list statuses for which no Model is present in the database.

Or you can make use of an aggregate with filter=:

from django.db.models import Count, Q

Model.objects.aggregate(
    nactive=Count('pk', filter=Q(status='active')),
    ncancelled=Count('pk', filter=Q(status='cancelled')),
    ndraft=Count('pk', filter=Q(status='draft'))
)

This will return a dictionary:

{
    'nactive': 25,
    'ncancelled': 25,
    'ndraft': 13
}

items for which it can not find a Model will be returned as None.

like image 86
Willem Van Onsem Avatar answered Oct 22 '25 02:10

Willem Van Onsem



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!