如何从多对多关系的属性中获取 Django 查询的值?

How to get values of a django query from attributes of a many to many relation?

我有这两个型号:

class Company(models.Model):
    name = models.CharField(max_length=100)

class User(models.Model):
    ACCES_TYPE_CHOICES = (
        ('ADMIN', 'Admin'),
        ('GUEST', 'Guest')
    )
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='users')
    access_type = models.CharField(max_length=5, choices=ACCES_TYPE_CHOICES)

我想要一个查询,该查询将 return 每个公司的 access_type == GUEST 用户数和 access_type == ADMIN 用户数的值,如下所示:

<QuerySet [{'id': 1, 'name': 'Company name', 'admin_users': 3, 'guest_users': 1}]>

我尝试了一些带有注释的方法,但找不到解决方案。

感谢您的帮助!

您可以使用 filter=… parameter [Django-doc] in a Count expression [Django-doc]:

from django.db.models import Count, Q

Company.objects.annotate(
    admin_users=Count('users', <b>filter=Q(access_type='ADMIN')</b>),
    guest_users=Count('users', <b>filter=Q(access_type='GUEST')</b>)
)

由此产生的Company对象将有两个额外的属性:.admin_users.guest_users