获取Django查询中的最高计数和相应值

时间:2017-12-06 04:40:30

标签: django django-models

我有一个病人模型"疾病"作为其中一个领域。 我想计算所有患者对象中的前5种疾病,并返回每种疾病的计数。我怎么能这样做?

2 个答案:

答案 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]