如何 return 精确匹配 ManyToMany 查询

How to return exact matches for ManyToMany queries

假设我有一个像

这样的模型
class Group:
    users = ManyToMany(User, related_name='groups')

我的群组中有不同的用户组合

group1 = Group(users=[user1])
group2 = Group(users=[user1, user2])
group3 = Group(users=[user1, user2, user3])

我该如何查询仅包含 user1user2 的组?

我想做一些类似 Group.objects.filter(users=[user1, user2]) -> [group2]

的事情

但我越来越 TypeError: Field 'id' expected a number but got [<User: user1>, <User: user2>].

如果我这样做 Group.objects.filter(user__in=[user1, user2].distinct('id')

它returns支持所有组[group1, group2, group3]

我知道如何通过 User 实例获取所有用户组,但我特别想通过 Group 模型。

我想我可能必须使用 ORM 进行某种类型的匹配...也许是子查询?

您可以过滤:

from django.db.models import Count, Q

# since Django-2.0

users = [user1, user2, user3]
users = set(users)

group1 = Group.objects.annotate(
    nusers=Count('users'),
    nuser_match=Count('users'<b>, filter=Q(users__in=users)</b>)
).filter(
    nusers=len(users),
    nusers_match=len(users)
)

因此,这将计算相关用户的总数,以及匹配的用户数。这两个数字都应等于集合中的用户数。