2013-05-01 11 views
14

Mam listę pk wystąpień modelu tagów, powiedzmyDjango queryset uzyskać dokładną manytomany odnośnika

pk_list = [10, 6, 3] 

mam inny model z pola m2m tagów i instancję, która zawiera dokładnie 3 znaczniki (z powyższych PKS) .

class Node(models.Model): 
    ... 
    tags = models.ManyToManyField(Tag, related_name='nodes') 

Chciałbym pobrać węzeł, który zawiera dokładny zestaw znaczników określony na mojej liście pk_list. Kiedy zrobić

Node.objects.filter(tags__in=pk_list) 

zwraca listę trzech takich samych przypadkach

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

Wywołanie .get() nie działa, bo to trzeba zwrócić pojedynczą instancję, oczywiście.

Jak mogę odzyskać pojedyncze wystąpienie? Muszę zauważyć, że jeśli moja lista pk była inna, np. [10, 6] lub [10, 6, 3, 7] wtedy nie otrzymam nic. Potrzebuję dokładnego dopasowania.

Dzięki

+0

Chciałem odpowiedzieć, a następnie zauważyłem, że poczta to ja! –

+0

Dzięki za komentarze i przepraszam za duplikat, nie zrobiłem tego celowo. – gwaramadze

Odpowiedz

16

Jednym ze sposobów jest wykorzystanie łańcucha filtrów:

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

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

Teraz node_query będzie pasował do węzła, który ma przynajmniej trzy znaczniki PK 10, 6, 3. W celu dokładnego dopasowania z trzech tagi:

UPDATE: Dzięki @janos i @Adrián López, poprawnej odpowiedzi i s:

+0

Przybijam to, sirowie! – gwaramadze