我有一个病人模型"疾病"作为其中一个领域。 我想计算所有患者对象中的前5种疾病,并返回每种疾病的计数。我怎么能这样做?
答案 0 :(得分:3)
尝试以下查询:
from django.db.models import Count
Patient.objects.values('disease').order_by().annotate(Count('disease'))
如果您的患者表中有以下数据,
+---------+
| disease |
+---------+
| A |
| B |
| A |
| C |
| A |
| A |
| C |
+---------+
输出将是: -
<QuerySet [{'disease': 'A', 'disease__count': 4}, {'disease': 'B','disease__count': 1}, {'disease': 'C', 'disease__count': 2}]>
有很多方法可以从此输出中找到最大值。
from django.db.models import Count
from django.db.models import Max
Patient.objects.values('disease').order_by().annotate(disease_count=Count('disease')).aggregate(maxval=Max('disease_count'))
输出将是: - {'maxval': 4}
from django.db.models import Count
query_result = Patient.objects.values('disease').order_by().annotate(disease_count=Count('disease'))
maxval = max(query_result, key=lambda x:x['disease_count'])
输出将是: - {'disease': 'A', 'disease_count': 4}
希望有所帮助!
答案 1 :(得分:1)
我认为最好的方法是将患者和疾病分成两个不同的模型:
class Patient(models.Model):
...
class Disease(models.Model):
patients = models.ManyToManyField(Patient) # One disease can have n patients
disease_name = models.CharField(# Customize this as you want)
然后在你的方法中你可以这样做(它可以是模型方法或外部方法):
def your_method_name():
Disease.objects.all().annotate(num_patients=Count('patients'))\
.order_by('num_patients')[:5]