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 关系是在 Unit
和 Weapon
模型之间定义的。我使用以下查询找出每个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:如何聚合/注释多对多关系?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Eloquent 中具有多对多关系的外部表中的列聚合进行分组?