Django:如何聚合/注释多对多关系?

Posted

技术标签:

【中文标题】Django:如何聚合/注释多对多关系?【英文标题】:Django: how to aggregate / annotate over a many-to-many relationship? 【发布时间】:2011-04-06 11:58:36 【问题描述】:

我有一个 Person 模型和一个 Tag 模型,它们之间有一个 m2m。

我需要提取与给定 Person 查询集中的最多记录相关联的标记以及计数。

有没有一种优雅、高效的方法来使用 Django ORM 提取它?

更好的是,有没有办法通过一些注释来获得整个标签分布?怎么能将所有连接到通过 m2m 连接的对象子集的对象拉出来?

谢谢!

【问题讨论】:

【参考方案1】:

我需要提取与给定 Person 查询集中最多记录相关联的标签以及计数。

我之前也遇到过类似的问题。在我的例子中,m2m 关系是在 UnitWeapon 模型之间定义的。我使用以下查询找出每个Unit 使用的武器数量,并按照武器数量的降序对它们进行排序。

from django.db.models import Count
q = Unit.objects.all().annotate(count = Count('weapons')).order_by('-count')

我会根据您的要求调整查询:

q = User.objects.all().annotate(count = Count('tag')).order_by('-count')

【讨论】:

【参考方案2】:

这会给你最频繁的标签:

from django.db.models import Count
Tag.objects.filter(person__yourcriterahere=whatever [, morecriteria]).annotate(cnt=Count('person')).order_by('-cnt')[0]

【讨论】:

完美。只是一个小错字:“.object”。应该是“.objects”。 太棒了,非常感谢。对于像我这样愚蠢的人,你必须导入: from django.db.models import Count

以上是关于Django:如何聚合/注释多对多关系?的主要内容,如果未能解决你的问题,请参考以下文章

Django:表多对多查询聚合分组FQ查询事务

如何通过 Eloquent 中具有多对多关系的外部表中的列聚合进行分组?

如何在 Django 中向多对多关系中添加字段?

如何使递归多对多关系与 Django 对称

如何在双连接关系之后在 Django 中执行查询(或:如何绕过 Django 对多对多“通过”模型的限制?)

在 django orm 中聚合多对多