2013-05-01 16 views
14

ich eine pk Liste der Instanzen von Tag-Modell habe, sagtDjango queryset genauen ManyToMany Lookup bekommt

pk_list = [10, 6, 3] 

Ich habe ein anderes Modell mit m2m Feld-Tags und eine Instanz, die (von oben pks) genau 3-Tags enthält .

Ich möchte einen Knoten abrufen, der genaue Tags enthält, wie in meiner pk_list angegeben. Als ich

tun
Node.objects.filter(tags__in=pk_list) 

es gibt eine Liste von drei gleichen Instanzen

[<Node: My node title>, <Node: My node title>, <Node: My node title>] 

Aufruf .get() funktioniert nicht weil es eine einzige Instanz zurückgeben müssen, offensichtlich.

Wie kann ich also eine einzelne Instanz abrufen? Ich muss beachten, dass wenn meine pk_list anders war, zB. [10, 6] oder [10, 6, 3, 7] dann muss ich nichts erhalten. Ich brauche eine genaue Übereinstimmung.

Dank

+0

Ich wollte antworten, dann bemerkte, dass Post ich bin! –

+0

Danke für die Kommentare und Entschuldigung für das Duplikat, ich habe es nicht absichtlich gemacht. – gwaramadze

Antwort

16

Ein Ansatz ist Kette von Filtern zu verwenden:

node_query = Node.objects.all() 
pk_list = [10, 6, 3] 

for pk in pk_list: 
    node_query = node_query.filter(tags=pk) 

Jetzt wird node_query Knoten übereinstimmen, das hat mindestens drei Schlüssel pk 10, 6, 3. Um eine exakte Übereinstimmung von drei tags:

UPDATE: Dank @janos und @Adrián López, die richtige Antwort i s:

from django.db.models import Count 

pk_list = [10, 6, 3] 
node_query = Node.objects.annotate(count=Count('tags')).filter(count=len(pk_list)) 

for pk in pk_list: 
    node_query = node_query.filter(tags__pk=pk) 
+0

Nailed it, Sirs! – gwaramadze