如何 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])
我该如何查询仅包含 user1
和 user2
的组?
我想做一些类似 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)
)
因此,这将计算相关用户的总数,以及匹配的用户数。这两个数字都应等于集合中的用户数。
假设我有一个像
这样的模型class Group:
users = ManyToMany(User, related_name='groups')
我的群组中有不同的用户组合
group1 = Group(users=[user1])
group2 = Group(users=[user1, user2])
group3 = Group(users=[user1, user2, user3])
我该如何查询仅包含 user1
和 user2
的组?
我想做一些类似 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)
)
因此,这将计算相关用户的总数,以及匹配的用户数。这两个数字都应等于集合中的用户数。