2015-10-26 8 views
9

मैं Django-एमपीपीटी साथ Django पर किसी दिए गए नोड के सभी बच्चों की वस्तुओंमैं Django mptt के साथ नोड के सभी बच्चों की वस्तुओं से कैसे पूछूं?

मैं एक मॉडल के रूप में नीचे दिखाया गया के लिए बनाया गया है, कक्षाओं/श्रेणियों (नोड) एक ही मांगपत्र स्तर के साथ भाई बहन को परिभाषित करता है पाने के लिए कोशिश कर रहा हूँ , आंतरिक इंडेंट बच्चे हैं। एक श्रेणी के साथ टैग की गई वस्तुओं को श्रेणी (नोड) के नीचे दिखाया गया है। ऑब्जेक्ट्स - प्रतीक से शुरू होते हैं। कक्षाओं/श्रेणियों (नोड्स) के साथ संख्याएं आईडी हैं।

सभी नोड्स दिए गए Category कक्षा के उदाहरण हैं।

high school (1) 
    class 8 (2) 
     division a (3) 
      -Billie 
      -Tre 
      -Mike 

     division b (4) 
      -Patrik 
      -Pete 
      -Andy 
    class 9 (3) 
     division a (8) 
      -Mark 
      -Tom 
      -Travis 

     division b (5) 
      -Gerard 
      -Frank 
      -Mikey 

    class 10 (4) 
     division a (6) 
      -Hayley 
      -Jeremy 
      -Taylor 

     division b (7) 
      -Steven 
      -Slash 
      -Izzy 

मैं एक विशिष्ट नोड के क्वेरी सेट इस तरह से प्राप्त कर सकते हैं,

>>> Category.objects.get(pk=7).product_set.all() 
[Steven, Slash, Izzy] 


>>> Category.objects.get(pk=4).product_set.all() 
[Mark, Tom, Travis] 

कैसे मैं सभी बच्चे वस्तुओं को पाने के लिए pk=1, pk=2, pk=3 या pk=4 साथ क्वेरी करते हैं?

उदाहरण,

pk=2 क्वेरी के लिए क्वेरी लौटना चाहिए

[Billie, Tre, Mike, Patrik, Pete, Andy] 
+0

अपने उदाहरण pk = 2 के साथ नोड से संबंधित लगता है, या मैं कुछ याद किया? – sax

+0

@sax हाँ यह एक टाइपो है, तय कर दिया है। – Rivadiz

+0

@Ivan स्तर अलग होंगे – Rivadiz

उत्तर

1

Category.objects.get(pk=1).get_leafnodes() आप जो खोज रहे हैं है।

(django-mptt docs)

+0

को अद्यतन किया है प्रश्न – Rivadiz

3

Django mptt बच्चों को पुनः प्राप्त करने के दो तरीके प्रदान करता है।

docs

MPTTModel.get_children से

(* args, ** kwargs)

एक क्वेरीसमूह इस मॉडल की तत्काल बच्चों युक्त रिटर्न> उदाहरण के लिए, पेड़ के क्रम में।

उदाहरण के बच्चों को ओआरएम द्वारा प्रदान किए गए रिवर्स रिलेशनशिप पर इस विधि का उपयोग करने का लाभ यह है कि उदाहरण के मामले में एक डेटाबेस क्वेरी से बचा जा सकता है जहां उदाहरण एक पत्ता नोड है (इसमें कोई बच्चा नहीं है)।

यदि टेम्पलेट से कहा जाता है जहां पेड़ cache_tree_children फ़िल्टर द्वारा चलाया गया है, तो कोई डेटाबेस क्वेरी आवश्यक नहीं है।

और

MPTTModel.get_leafnodes (* args, ** kwargs)

, एक क्वेरीसमूह इस मॉडल उदाहरण के leafnodes युक्त बनाता पेड़ के क्रम में।

तो include_self यह सच है, क्वेरीसमूह भी इस मॉडल उदाहरण शामिल होंगे (अगर यह एक पत्ता नोड है)

मुझे यकीन है कि कैसे अपने मॉडल स्थापित कर रहे हैं नहीं कर रहा हूँ, लेकिन मुझे यकीन है कि नहीं कर रहा हूँ तुम क्यों यहां mptt का उपयोग करें। आप श्रेणी/उत्पाद का उपयोग कर रहे हैं लेकिन ऐसा लगता है कि यह छात्र या लोग और कार्य समूह हैं।

शायद तुम EstablishmentLevel, Level|, StudentGroup, Student मॉडल को परिभाषित कर सकते हैं और mptt समारोह क्वेरी कुछ उपयोग करने के बजाय की तरह:

Student.objects.filter(studentgroup__level__pk=1) 

Django doc

आशा है कि

14
Category.objects.get(pk=2).get_descendants(include_self=True) 

मदद की देखें यह आपको स्वयं सहित सभी श्रेणी वंश प्राप्त करेगा।

मानते हुए अपने उत्पाद मॉडल एक विदेशी कुंजी श्रेणी है, तो आप उपयोग कर सकते हैं:

Product.objects.filter(category__in=Category.objects.get(pk=2)\ 
    .get_descendants(include_self=True)) 
+0

प्रश्न क्या है? श्रेणी केवल वंश से वंशज लाने के लिए कैसे जानता है? क्या होगा यदि श्रेणी में विजेट से वंशज भी हैं? क्या यह इन दोनों से प्राप्त होता है, या क्या आपको यह निर्दिष्ट करना होगा कि कौन से से प्राप्त करना है? – kloddant

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