Home > database >  How to get top 5 records in django dict data
How to get top 5 records in django dict data

Time:07-22

I m having two tables 1) Visit 2) disease. visit table having a column for disease. I m trying to get top 5 disease from visit table.

dis=disease.objects.all()
for d in dis:
    v=visits.objects.filter(disease=d.disease_name).count()    
    data={
    d.disease_name : v
    }
    print (data)
    

This print all disease with respective count. as below:

{'Headache': 2}
{'Cold': 1}
{'Cough': 4}
{'Dog Bite': 0}
{'Fever': 2}
{'Piles': 3}
{'Thyroid': 4}
{'Others': 9}

I want to get top 5 from this list based on count. How to do it?

CodePudding user response:

Add data in a list and sort list based on what you want:

dis=disease.objects.all()
l = list()
for d in dis:
    v=visits.objects.filter(disease=d.disease_name).count()    
    data={
        d.disease_name : v
    }
    l.append(data)

l.sort(reverse=True, key=lambda x:list(x.values())[0])
for i in range(min(len(l), 5)):
    print(l[i])

CodePudding user response:

You can sort these values by writing code like that:

diseases = list(Disease.objects.values_list('disease_name', flat=True))
visits = list(
    Visits.objects.filter(disease__in=diseases).values_list('disease', flat=True))
data = {}
for name in diseases:
    count = visits.count(name)
    data[name] = count
sorted_data = sorted(data.items(), key=operator.itemgetter(1), reverse=True)
new_data = {}
for idx in range(min(len(sorted_data), 5)):
    item = sorted_data[idx]
    new_data[item[0]] = item[1]
print(new_data)

It's little messy, but it does the job: enter image description here

I also optimised your queries, so the code should also run bit faster (when you do logic like that, use list and .values_list(...) because it caches data in memory - and using native python functions on list instead of QuerySet like .count() should also be faster than hitting database).

CodePudding user response:

Thank you all for your reply, I got an other simple solution for it.

    from django.db.models import Count
x = visits.objects.values('disease').annotate(disease_count=Count('disease')).order_by('-disease_count')[:5]
    print(x)

it returns as below:

<QuerySet [{'disease': 'Others', 'disease_count': 9}, {'disease': 'Thyroid', 'disease_count': 4}, {'disease': 'Cough', 'disease_count': 4}, {'disease': 'Piles', 'disease_count': 3}, {'disease': 'Headache', 'disease_count': 2}]>

I think this is simplest solutions. It working for me...

  • Related