2010-02-24 13 views
7

में बाल नोड्स को पुन: क्रमबद्ध करना मैं recommendation के लिए django-MPTT (टोपी टिप Daniel Roseman) के बेन फ़िरशैन के fork का उपयोग कर रहा हूं।django-MPTT

मैं एक सामान्य माता-पिता साझा करने वाले नोड्स को फिर से ऑर्डर करने की कोशिश कर रहा हूं। मैं प्राथमिक कुंजी की एक सूची मिल गया है, इस तरह:

ids = [5, 9, 7, 3] 

इन नोड्स के सभी है एक माता पिता, प्राथमिक कुंजी 1.

वर्तमान में साथ कहते हैं, इन नोड्स [5, 3, 9, 7] आदेश दिया है, कैसे कर सकते हैं कर रहे हैं मैं उन्हें [5, 9, 7, 3] पर पुन: ऑर्डर करें?

मैं कुछ इस तरह की कोशिश की है:

last_m = MyModel.get(pk = ids.pop(0)) 
last_m.move_to(last_m.parent, position='first-child') 

for id in ids: 
    m = MyModel.get(pk = id) 
    m.move_to(last_m, position='right') 

कौन सा मैं docs on move_to प्रति, मैं क्या करना चाहते हैं उम्मीद थी, लेकिन यह कुछ भी बदलने की नहीं लगती। कभी-कभी ऐसा लगता है कि ids में पहले आइटम को अपने माता-पिता का पहला बच्चा माना जाता है, कभी-कभी ऐसा नहीं होता है।

मैं सही move_to के लिए किए गए दस्तावेज़ों की मेरी पढ़ने में हूँ कि एक नोड position=right साथ n और एक लक्ष्य जो n का एक भाई है पर move_to बुला n चले जाएँगे लक्ष्य के बाद करने के लिए तुरंत?

यह संभव है कि मैंने इसे बाहर निकालने की कोशिश में अपनी मॉडल तालिका को खराब कर दिया है, तो शायद ऊपर दिया गया कोड वास्तव में सही है। यह भी संभव है कि ऐसा करने का एक और अधिक शानदार तरीका है (शायद वह जिसमें O(n) शामिल नहीं है और O(n) अद्यतन) शामिल हैं।

क्या मैंने कुछ गलत समझा है?

बोनस प्रश्न: क्या किसी दिए गए मॉडल के सभी उदाहरणों के लिए lft और rght मानों का पुनर्निर्माण करने के लिए django-MPTT को मजबूर करने का कोई तरीका है?

उत्तर

5

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

इस का परिणाम यह है अपने कोड में, प्रत्येक mlast_m के अधिकार के लिए ले जाया गया हो जाता है नए पोस्ट-मूव वाले लोगों में से। - MPTT सवालों में अपने जवाबों के कुछ पढ़

for id in ids: 
    last_m = MyModel.objects.get(pk=last_m.id) 
    m = MyModel.get(pk = id) 
    m.move_to(last_m, position='right') 
+0

मैं संदिग्ध यह है कि के साथ कुछ था:

समाधान last_m हर बार फिर से लोड करने के लिए है। मैं इसे जाने दूंगा। क्या आपको बोनस प्रश्न के बारे में कोई जानकारी है? –

+0

@Daniel - उस पर लूप को बंद करना भूल गया। आपका जवाब बहुत अच्छा काम किया। अभी भी एमपीटीटी के बारे में थोड़ा परेशान है और पेड़ की खराब स्थिति में आने की संभावना है - क्या आपके पास इसका प्रबंधन करने के लिए कोई सुझाव है? –

+3

पुराना सवाल, लेकिन यहां किसी भी व्यक्ति के लिए जो ठोकर खा रहा है - आप ModelName.tree.rebuild() के साथ एक एमपीटीटी ट्री का पुनर्निर्माण कर सकते हैं। यह उपयोगी है अगर आपने MPTTMeta order_insertion_by फ़ील्ड को परिभाषित किया है और अपने पेड़ के क्रम को अपडेट करने की आवश्यकता है। – Nagyman

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

  • कोई संबंधित समस्या नहीं^_^