2013-05-01 71 views
14

我有標籤模型的實例的PK名單,說Django的查詢集得到確切多對多查找

pk_list = [10, 6, 3] 

我有一個標籤M2M領域的另一種模式,並完全包含3個標籤(以上PKS)的一個實例。

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

我想找回在我pk_list指定包含精確設定的標籤節點。當我做

Node.objects.filter(tags__in=pk_list) 

它返回三個相同的情況下

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

的調用。獲得列表()因爲它必須返回一個實例,顯然是行不通的。

那麼,如何檢索單個實例? 我必須注意,如果我的pk_list是不同的例如。 [10,6]或[10,6,3,7],那麼我一定得不到任何東西。我需要一個完全匹配。

由於

+0

我打算回答,然後注意到帖子是我的! – 2013-05-01 19:29:25

+0

感謝您的意見,並抱歉重複,我沒有故意這樣做。 – gwaramadze 2013-05-01 20:16:14

回答

16

一種方法是使用過濾器鏈:

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

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

現在node_query將匹配節點,具有至少三個標記PK與10,圖6,3.精確匹配三個標籤:

UPDATE: 感謝@janos@Adrián López,正確答案我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

釘着它,先生! – gwaramadze 2013-05-01 20:21:41