我的代码中有这个模型:
class Conversation(models.Model):
participants = models.ManyToManyField(User, related_name="message_participants")
我需要通过“参与者”多对多字段过滤这个“对话”模型对象。含义:例如,我有 3 个用户对象,所以我想检索在其“参与者”字段中具有这 3 个用户的唯一“对话”对象。
我试过这样做:
def get_exist_conv_or_none(sender,recipients):
conv = Conversation.objects.filter(participants=sender)
for rec in recipients:
conv = conv.filter(participants=rec)
其中 sender 是 User 对象,“recipients”是 User 对象的列表。它不会引发错误,但它给了我错误的对话对象。谢谢。
编辑:最近的一次尝试让我明白了这一点:
def get_exist_conv_or_none(sender,recipients):
participants=recipients
participants.append(sender)
conv = Conversation.objects.filter(participants__in=participants)
return conv
基本上有同样的问题。它产生在列表中具有一个或多个“参与者”的对象。但我正在寻找的是多对多对象的精确匹配。意思是,一个具有精确“用户”的对象是多对多关系。
编辑2:我的最后一次尝试。仍然,不会工作。
def get_exist_conv_or_none(sender,recipients):
recipients.append(sender)
recipients = list(set(recipients))
conv = Conversation.objects.annotate(count=Count('participants')).filter(participants=recipients[0])
for participant in recipients[1:]:
conv.filter(participants=participant)
conv.filter(count=len(recipients))
return conv