2010-01-28 14 views
7

मैं बहुत कम भाग्य के साथ django-mptt का उपयोग करने का प्रयास कर रहा हूं। यह Python2.5, विंडोज़, sqlite3, Django 1.2pre, django-mptt svn से नवीनतम है।Django-mptt पूरी तरह से छोटी गाड़ी या क्या मैं इसे गलत कर रहा हूं?

कोड:

मॉडल:

class Node(models.Model): 
    name = models.CharField(max_length=20, blank=True) 
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children') 

    def __unicode__(self): 
     return self.name 

mptt.register(Node) 

स्थापना:

nodes = [] 
for i in range(15): 
    n = Node(name='node'+str(i)) 
    n.save() 
    nodes.append(n) 

nodes[0].move_to(None) 
nodes[0].save() 
for n in range(1,15): 
    nodes[n].move_to(nodes[(n-1)/2],'last-child') 
    nodes[n].save() 

यह एक जड़ और प्रत्येक गैर-पत्ती नोड के बंद फांसी दो बच्चों के साथ एक पेड़ बनाना चाहिए।

अब मज़ा शुरू होता है:

>>> nodes[0].children.all() 
[<Node: node1>, <Node: node2>] 
>>> nodes[0].get_descendants() 
[] 

>>> nodes[0].get_descendants(True) 
[<Node: node0>, <Node: node2>] 


>>> for n in nodes: 
...  print n, n.get_ancestors() 
... 
node0 [] 
node1 [<Node: node0>] 
node2 [<Node: node0>] 
node3 [<Node: node0>, <Node: node2>] 
node4 [<Node: node0>, <Node: node2>] 
node5 [<Node: node0>, <Node: node2>] 
node6 [<Node: node0>, <Node: node2>] 
node7 [<Node: node0>, <Node: node2>, <Node: node6>] 
node8 [<Node: node0>, <Node: node2>, <Node: node6>] 
node9 [<Node: node0>, <Node: node2>, <Node: node6>] 
node10 [<Node: node0>, <Node: node2>, <Node: node6>] 
node11 [<Node: node0>, <Node: node2>, <Node: node6>] 
node12 [<Node: node0>, <Node: node2>, <Node: node6>] 
node13 [<Node: node0>, <Node: node2>, <Node: node6>] 
node14 [<Node: node0>, <Node: node2>, <Node: node6>] 

क्यों पूर्वजों के इतने गलत कर रहे हैं? उदाहरण के लिए, नोड 10 में पूर्वजों होना चाहिए, (0,1,10)

क्या मैं कुछ गलत कर रहा हूं या क्या django-mptt में बग हैं?

उत्तर

14

मैं यह नहीं कहूंगा कि यह छोटी है, लेकिन एक गॉचा है जिसे आपको अवगत होना चाहिए।

जब आप किसी बच्चे को बच्चा जोड़ते हैं, तो बच्चे के पेड़ विशेषताओं को एमपीटीटी-विशिष्ट lft, rght और level मानों के साथ सही ढंग से अपडेट किया जाता है।

हालांकि, django-mptt आपके द्वारा धारित किए जा रहे माता-पिता के संस्करण को अद्यतन करता है। डेटाबेस में संस्करण अपडेट किया गया है, लेकिन आपके स्थानीय चर में प्रतिलिपि नहीं है (याद रखें कि Django मॉडल के उदाहरणों में पहचान नहीं है, इसलिए जब डेटाबेस, या अन्य उदाहरण एक ही डेटाबेस पंक्ति का जिक्र करते हैं, तो अपडेट न करें)।

इसका मतलब है कि आप जिस बच्चे को मूल वस्तु में जोड़ते हैं वह गलत बाएं और दाएं मान प्राप्त करेगा, और यदि आप बाद में माता-पिता को सहेजते हैं तो भी गलत मान होंगे।

for n in range(1,15): 
    parent_pos = (n-1)/2 
    parent = nodes[parent_pos] 
    nodes[n].move_to(parent, 'last-child') 
    nodes[n].save() 
    nodes[parent_pos] = Node.objects.get(pk=parent.pk) 
+0

आप इस उत्तर के लिए बहुत बहुत धन्यवाद:

समाधान हर बार जब आप एक बच्चे को जोड़ने के डेटाबेस से माता-पिता को फिर से लोड करने के लिए है। मुझे लगता है कि मैं अपने मामले में mptt का उपयोग नहीं करूंगा और "RECURSIVE" का प्रयास करूंगा जो PostgreSQL द्वारा समर्थित है। – guettli

+0

मैंने इसे कुछ मिनट पहले एक और साइट पर पाया, लेकिन आपकी व्याख्या सबसे संक्षिप्त थी और पुष्टि करता है कि मैं इसे सही ढंग से समझता हूं। धन्यवाद – Gattster

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