【问题标题】:Query to categorize a model by the number of foreign key items查询以按外键项的数量对模型进行分类
【发布时间】:2020-08-07 20:28:26
【问题描述】:

我有以下型号:

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')

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

【问题讨论】:

  • Family 中的哪个字段需要分组进行计数?
  • 请看答案。没有要分组的字段,它应该按在场的人数进行分组,总结家庭。

标签: django


【解决方案1】:

目前我不是通过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], ...] 的有序列表,其中89 家庭有1 个人,10 家庭有2 个人等;这就是我希望直接从SQL 获得的信息。

【讨论】:

  • 哦。给你一个post,希望你能得到诀窍,或者根据你的列表结果,你可以使用itertools.groupby来解决它。
猜你喜欢
  • 2018-03-23
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2020-10-29
  • 2013-03-12
相关资源
最近更新 更多