可以说我有这样一个模型:
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 连接的所有对话。
我尝试了这个:其他答案,但它返回空查询集。
我们可以计算有多少个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
或者对于django-2.0之前的安装:
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)
| 归档时间: |
|
| 查看次数: |
1058 次 |
| 最近记录: |