Ich habe dieses Modell in meinem Code:Wie filtert man das Django-Modell mit seinen Objekten im Viele-zu-Viele-Feld (exakte Übereinstimmung)?
class Conversation(models.Model):
participants = models.ManyToManyField(User, related_name="message_participants")
und ich brauche diese "Gespräch" Modellobjekte von den "Teilnehmern" many-to-many-Feld zu filtern. Bedeutung: Ich habe zum Beispiel 3 Benutzerobjekte, also möchte ich die einzigen "Conversation" -Objekte abrufen, die diese 3 Benutzer in ihrem "Teilnehmer" -Feld hat.
Ich habe versucht, dies zu tun:
ein Objekt Benutzerdef get_exist_conv_or_none(sender,recipients):
conv = Conversation.objects.filter(participants=sender)
for rec in recipients:
conv = conv.filter(participants=rec)
wo Sender und ist Objekte eine Liste von User "Empfänger" ist. es wird keinen Fehler auslösen, aber es gibt mir das falsche Objekt der Konversation. Danke.
edit: Ein neueres versuchen, mich dazu führen:
def get_exist_conv_or_none(sender,recipients):
participants=recipients
participants.append(sender)
conv = Conversation.objects.filter(participants__in=participants)
return conv
, die im Grunde das gleiche Problem haben. Es liefert Objekte, die einen oder mehrere der "Teilnehmer" in der Liste haben. Aber was ich suche, ist die exakte Übereinstimmung des Viele-zu-Viele-Objekts. Bedeutet, ein Objekt mit dem genauen "Benutzer" ist es viele-zu-viele Beziehung.
edit 2: Mein letzter Versuch. immer noch, wird 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
Dies ist auch hier [Frage] (http://stackoverflow.com/questions/13435394/get-instance-by-exact-m2m-values/13435503#13435503) – PepperoniPizza
Die Antwort dort ist unvollständig. Ich muss genau die Benutzer treffen. Das bedeutet, dass Sie ein Conversation-Objekt abrufen, das genau die gewünschten Benutzer enthält, nicht weniger, nicht mehr. – SnirD