【问题标题】:Django - Annotate with count across ManytoMany relationshipsDjango - 在多对多关系中使用计数进行注释
【发布时间】:2018-10-10 05:20:35
【问题描述】:

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

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 请求?

谢谢!

【问题讨论】:

    标签: django django-models django-annotate


    【解决方案1】:

    如果我理解正确,你只需要这个:

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

    这几乎就是你写的。

    【讨论】:

    • 谢谢!我想我把事情复杂化了!阅读您的回复后,我意识到 ManyToMany 关系是双向的,如果我在角色模型而不是配置文件中声明它,那么我可以更轻松地看到答案。无论如何感谢您的快速回答,我花了太多时间在这上面! :)
    猜你喜欢
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2011-04-06
    • 2016-06-17
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多