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

时间:2010-08-31 20:44:06

标签: django many-to-many django-queryset

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

我需要提取与给定Person查询集中的大多数记录连接的标记以及计数。

使用Django ORM是否有一种优雅,有效的方法来提取它?

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

谢谢!

2 个答案:

答案 0 :(得分:7)

这会给你最频繁的标签:

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

答案 1 :(得分:2)

  

我需要提取连接到给定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')