Как получить 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)
Это немного грязно, но это делает свою работу:
Я также оптимизировал ваши запросы, так что код должен работать немного быстрее (когда вы делаете подобную логику, используйте 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}]>
Я думаю, что это самое простое решение. Оно работает для меня...