gpt4 book ai didi

sql - Django 找到多对多关系的完全匹配

转载 作者:行者123 更新时间:2023-12-04 23:16:51 25 4
gpt4 key购买 nike

假设我有这样一个模型:

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

我想找到一个与用户 [1,2]

完全相关/仅相关的对话

我试过这个:

conversation = Conversation.objects.filter(
members__in=[1, 2]
)

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

我试过这个:other answer但它返回空查询集。

最佳答案

我们可以计算有多少 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
)

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

或前 安装:

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
)

关于sql - Django 找到多对多关系的完全匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57790263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com