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

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

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

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

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

谢谢!

【问题讨论】:

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


    【解决方案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
      猜你喜欢
      • 2015-06-20
      • 1970-01-01
      • 2014-05-30
      • 2016-11-18
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多