Django注释外键的外键数

时间:2017-07-13 02:16:22

标签: python django django-aggregation

我有三个主要模型:

Class Client(models.Model):
   stuff

Class Property(models.Model):
    client = models.ForeignKey(Client)
    branch = models.ForeignKey(Branch, blank=True, null=True)

Class Branch(models.Model):
    name = models.CharField(max_length=200)

我的最终目标基本上是根据与之相关的属性尝试推断客户最常参与的分支。

我确信最好的方法是使用注释使用Django的聚合,但我不确定如何做到这一点。我可能不得不使用extra

我知道我需要类似的东西 Client.objects.annotate(branch_count=Count('property__branch')),但我需要以某种方式为附加到每个分支的属性添加过滤。

另一种方式可能是使用Collections.Counter

d = {}
for c in Client.objects.all():
    d[c] = Counter(c.property_set.values_list('branch', flat=True))

这将构建一个计数字典,然后我将用它来查找任何一个客户端的计数最高的分支。

1 个答案:

答案 0 :(得分:0)

在属性模型中,为客户端提供related_name属性(比如说“client_ref”)

Client.objects.annotate(branch_count=Count(
             'client_ref__branch')).filter(branch__name="some_name")
             .values('branch')

其中name可以替换为其他一些过滤属性