首页 > 解决方案 > 查询以按外键项的数量对模型进行分类

问题描述

我有以下型号:

Family():
  family_id = models.CharField(db_index=True, max_length=100)

Individual():
  individual_id = models.TextField(db_index=True)
  family = models.ForeignKey(Family, on_delete=models.PROTECT)

我需要编写一个查询以获得以下结果:

家庭计数 | 个人计数
1 | 3
5 | 8
10 | 19

所以,我需要根据他们拥有的人数对家庭进行分类(不是作为他们的family_id,而是作为他们的计数!)。可能吗?如果是,如何?

到目前为止,我能够得到每个 family_id 有多少人:

overview_data = Family.objects.annotate(ind_count=Count('individual')).order_by('ind_count')

现在我需要一种方法来按他们的小组拥有的人数来总结他们。

标签: django

解决方案


目前我不是通过SQL查询而是使用python来解决它。我相信可以有纯粹SQL的查询,但我无法想出它。所以,如果你有任何想法,请回答。这是我解决问题的方法:

from collections import Counter 

def _generate_overview_data(project):                                                                                      
    data = Family.objects.annotate(ind_count=Count('individual'))                                                                     
            .values_list('ind_count', flat=True)                                                     
    return sorted(Counter(data).items())

data看起来像[1, 1, 1, 1, ..., 2, 2, ..., 3, 3, 3, ...] 所以,我计算 1、2、3 的出现次数,并得到家庭有个人、家庭有个人等类型[[1, 89], [2, 10], ...]的有序列表;这就是我更愿意直接从.891102SQL


推荐阅读