Wie filtere ich ein Django-Modell nach seinen Objekten in einem Many-to-Many-Feld (exakte Übereinstimmung)?

Ich habe dieses Modell in meinem Code:

class Conversation(models.Model):
    participants = models.ManyToManyField(User, related_name="message_participants")

und ich muss diese "Conversation" -Modellobjekte nach dem "Participants" -Viel-zu-Viel-Feld filtern. Das bedeutet: Ich habe zum Beispiel 3 Benutzerobjekte, also möchte ich die einzigen "Konversations" -Objekte abrufen, die diese 3 Benutzer im Feld "Teilnehmer" haben.

Ich habe versucht, dies zu tun:

def get_exist_conv_or_none(sender,recipients):
    conv = Conversation.objects.filter(participants=sender)
    for rec in recipients:
        conv = conv.filter(participants=rec)

Dabei ist der Absender ein Benutzerobjekt und "Empfänger" eine Liste von Benutzerobjekten. es wird keinen Fehler auslösen, aber es gibt mir das falsche Objekt des Gesprächs. Vielen Dank.

edit: Ein neuerer Versuch hat mich dazu geführt:

def get_exist_conv_or_none(sender,recipients):
    participants=recipients
    participants.append(sender)
    conv = Conversation.objects.filter(participants__in=participants)
    return conv

die haben grundsätzlich das gleiche problem. Es liefert Objekte, bei denen einer oder mehrere der "Teilnehmer" auf der Liste stehen. Aber was ich suche, ist die exakte Übereinstimmung des Viele-zu-Viele-Objekts. Das heißt, ein Objekt mit dem genauen "Benutzer" in seiner Viele-zu-Viele-Beziehung.

edit 2: Mein letzter Versuch. wird immer noch nicht funktionieren.

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage