Django 找到多对多关系的精确匹配

Prz*_*mek 3 sql django psql

可以说我有这样一个模型:

class Conversation(models.Model):
    sid = models.CharField(
        max_length=34,
        primary_key=True
    )
    members = models.ManyToManyField(to=User)
Run Code Online (Sandbox Code Playgroud)

我想找到一个与用户完全/仅相关的对话[1,2]

我试过这个:

conversation = Conversation.objects.filter(
            members__in=[1, 2]
        )
Run Code Online (Sandbox Code Playgroud)

但它会返回与用户 1 或 2 连接的所有对话。

我尝试了这个:其他答案,但它返回空查询集。

Wil*_*sem 5

我们可以计算有多少个members与列表匹配,并检查是否包含所有members

from django.db.models import Count, Q

members = [1,2]
members_len = len(set(members))

Conversation.objects.annotate(
    total_members=Count('members'),
    matching_members=Count('members', filter=Q(members__in=members))
).filter(
    matching_members=members_len,
    total_members=members_len
)
Run Code Online (Sandbox Code Playgroud)

因此,这将检索包含列表中所有Converstion成员的s ,并且检索这些成员(因此不是超集,也不是子集)。members

或者对于之前的安装:

from django.db.models import Case, Count, When

members = [1,2]
members_len = len(set(members))

Conversation.objects.annotate(
    total_members=Count('members'),
    matching_members=Count(Case(
        When(members__in=members, then='members'),
        default=None
    ))
).filter(
    matching_members=members_len,
    total_members=members_len
)
Run Code Online (Sandbox Code Playgroud)