Как получить 5 лучших записей в данных django dict

У меня есть две таблицы 1) Посещения 2) болезни. В таблице посещений есть столбец для болезней. Я пытаюсь получить 5 лучших заболеваний из таблицы посещений.

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

Это выводит все заболевания с соответствующим количеством. как показано ниже:

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

Я хочу получить 5 лучших из этого списка на основе подсчета. Как это сделать?

Вы можете отсортировать эти значения, написав код следующим образом:

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)

Это немного грязно, но это делает свою работу: enter image description here

Я также оптимизировал ваши запросы, так что код должен работать немного быстрее (когда вы делаете подобную логику, используйте list и .values_list(...), потому что он кэширует данные в памяти - и использование родных функций python на list вместо QuerySet, как .count(), также должно быть быстрее, чем удар по базе данных).

Добавьте данные в список и отсортируйте список на основании того, что вы хотите:

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])

Спасибо всем за ответ, у меня есть другое простое решение для этого.

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

возвращается следующее:

<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}]>

Я думаю, что это самое простое решение. Оно работает для меня...

Вернуться на верх