Django-用ManytoMany关系计数来注释

时间:2018-10-10 05:20:36

标签: django django-models django-annotate

我无法找到一种使用多对多关系中的元素使用次数计数来注释查询集的方法。

class Profile(models.Model):
    [...]
    # Profile can have multiple roles
    roles = models.ManyToManyField('Role', blank=True)
    [...]

class Role(models.Model):
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    name = models.CharField(blank=True, max_length=30)
    description = models.CharField(blank=True, max_length=300)
    [...]   

例如,我将有5个角色:

  • 角色1
  • 角色2
  • 角色3
  • 角色4
  • 角色5

以及分配了以下角色的2个配置文件:

  • 个人资料1
    • 角色1
    • 角色2
  • 个人资料2
    • 角色1
    • 角色3
    • 角色4

我想查询角色模型并注释具有该角色的配置文件的数量。

因此返回类似的查询集

Role1: company, name, description, profile_count=2
Role2: company, name, description, profile_count=1

等...

我已经尝试过了,但是不起作用:

Role.objects.annotate(profile_count=Count('profile__roles'))

它似乎返回一个总体计数,而不是每个角色的计数。

是否知道可以在Django中本地完成还是需要原始SQL请求?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,那么您只需要这样:

Role.objects.annotate(profile_count=Count('profile'))

几乎是您所写的。