我有两张桌子去看病。访问有一列疾病的桌子。我正试着从餐桌上得到前五名的疾病。
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}
我想从这个列表中根据计数得到前五名。该怎么做呢?
发布于 2022-07-22 09:21:47
谢谢你们的答复,我有另外一个简单的解决办法。
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}]>
我认为这是最简单的解决办法。它对我有效..。
发布于 2022-07-22 07:33:25
您可以通过编写这样的代码对这些值进行排序:
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(...)
,因为它在内存中缓存数据-使用list
上的原生python函数而不是.count()
之类的QuerySet
也应该比访问数据库更快)。
发布于 2022-07-22 08:35:56
根据所需内容在列表和排序列表中添加数据:
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])
https://stackoverflow.com/questions/73075681
复制相似问题