gpt4 book ai didi

django - 如何通过多对多字段中的对象(完全匹配)过滤 django 模型?

转载 作者:行者123 更新时间:2023-12-03 22:33:48 25 4
gpt4 key购买 nike

我的代码中有这个模型:

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

最佳答案

好的,所以我找到了答案:
为了进行精确匹配,我必须对模型进行链式过滤,然后确保它具有所需的确切参数数量,以便多对多字段中包含 全部 需要的对象,没有更多。

我将使用注释检查对象编号:( https://docs.djangoproject.com/en/dev/topics/db/aggregation/ )

结束了这个代码:

def get_exist_conv_or_none(recipients):
conv = Conversation.objects.annotate(count=Count('participants')).filter(participants=recipients[0])
for participant in recipients[1:]:
conv = conv.filter(participants=participant)
conv = conv.filter(count=len(recipients))
return conv

关于django - 如何通过多对多字段中的对象(完全匹配)过滤 django 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13586507/

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