2013-05-01 6 views
14

मैं टैग मॉडल के उदाहरणों में से एक पी सूची है मिलता है, कहते हैं किDjango क्वेरीसमूह सटीक manytomany देखने

pk_list = [10, 6, 3] 

मैं टैग की M2M क्षेत्र के साथ एक और मॉडल और एक उदाहरण (ऊपर पीकेएस की) वास्तव में होता है, जो 3 टैग नहीं है ।

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

मैं एक ऐसे नोड को पुनर्प्राप्त करना चाहता हूं जिसमें मेरे pk_list में निर्दिष्ट टैग के सटीक सेट शामिल हैं। जब मैं

Node.objects.filter(tags__in=pk_list) 

कर यह() .Get कॉलिंग तीन एक ही उदाहरणों

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

की एक सूची कारण यह एक उदाहरण वापस जाने के लिए, स्पष्ट रूप से है काम नहीं करता है देता है।

तो, मैं एक उदाहरण कैसे प्राप्त करूं? मुझे ध्यान रखना चाहिए कि अगर मेरी पीके_सूची अलग थी। [10, 6] या [10, 6, 3, 7] तो मुझे कुछ भी नहीं मिला। मुझे एक सटीक मिलान की ज़रूरत है।

धन्यवाद

+0

मैं जवाब देने जा रहा था, फिर मैंने देखा कि पोस्ट मुझे है! –

+0

टिप्पणियों के लिए धन्यवाद, और डुप्लिकेट के लिए खेद है, मैंने इसे उद्देश्य पर नहीं किया। – gwaramadze

उत्तर

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 नोड से मेल खाएगी, पी के 10, 6, 3 के साथ कम से कम तीन टैग सटीक मेल करने के लिए है कि

अद्यतन: तीन टैग की @janos और @Adrián López के लिए धन्यवाद, सही जवाब मैं एस:

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

संबंधित मुद्दे