2010-01-05 21 views
5

मैं Django में एक अप्रत्यक्ष ग्राफ बनाना चाहता हूं। मैंने नोड क्लास में दो विदेशी कुंजी (पहला, दूसरा) के साथ एक बढ़त मॉडल बनाया है, लेकिन संबंधित_नाम के साथ एक संघर्ष है। मैं first_set और second_set का उपयोग कर सकता हूं, लेकिन चूंकि ग्राफ अप्रत्यक्ष है, इससे कोई फर्क नहीं पड़ता कि इसे पसंद किया जा रहा है या नहीं। इस परिदृश्य से निपटने के लिए अनुशंसित तरीका क्या है?Django अप्रत्यक्ष ग्राफ

संपादित करें: यहाँ मोटे तौर पर मॉडल के साथ मैं काम कर रहा हूँ कर रहे हैं:

class Node(models.Model): 
    #some irrelevant stuff 

class Edge(models.Model): 
    #some other stuff 
    first = models.ForeignKey('Node',related_name=None) 
    second = models.ForeignKey('Node',related_name=None) 

मैं करना चाहते हैं क्या some_node.connected_nodes_set एक RelatedManager के प्रभाव, के लिए क्या हो गया होता सेटअप करने के लिए इसी तरह के लिए कुछ होना है या तो first_set या second_set मैंने संबंधित_नामों का उपयोग किया था, सिवाय इसके कि इसमें सभी नोड्स होंगे जो एक ही किनारे पर पहुंचा जा सकता है, केवल उन लोगों की बजाय जो एक दिशा में पहुंचा जा सकता है।

+1

क्या आप अपना एज और नोड मॉडल पोस्ट कर सकते हैं? – Seth

उत्तर

5

मुझे अपने वर्तमान प्रोजेक्ट के साथ कुछ ऐसा करना पड़ा। मेरा समाधान ManyToManyField आपके Node मॉडल के समतुल्य में था। कुछ इस तरह:

class Node(models.Model): 
    adjacent = models.ManyToManyField("self", null=True, blank=True) 

ध्यान दें कि "self" ऊपर ManyToManyField ही वापस करने के लिए बात करने के लिए अनुमति देने के लिए आवश्यक है।

इस कोड का उपयोग करके, दिए गए नोड N के समीप सभी नोड N.adjacent.all() का उपयोग करके देखे जा सकते हैं।

+1

यह आशाजनक लग रहा है, लेकिन समस्या यह है कि मुझे एज मॉडल में कुछ अतिरिक्त डेटा चाहिए। पहले विचार में, ऐसा प्रतीत होता है कि मैं कईToManyField ("स्वयं", = "एज", सममित = सही) के माध्यम से उपयोग कर सकता हूं, लेकिन दस्तावेज़ीकरण विशेष रूप से कहता है कि यदि आप मॉडल के माध्यम से उपयोग कर रहे हैं तो आपको सममित = गलत का उपयोग करना होगा। –

+3

आपको यह सुनिश्चित करना होगा कि हर बार जब आप 'एज' बनाते हैं तो व्यस्त संबंध बनाया जाता है। मेरे सिर के शीर्ष से, यह 'एज' की 'सेव' विधि को ओवरराइड करके स्वचालित रूप से करना संभव होना चाहिए। –

+2

जेफ के बावजूद समस्या यह है कि यह एक अप्रत्यक्ष ग्राफ नहीं है यदि आप इसे दोनों तरीकों से कर रहे हैं लेकिन लिंक की एक जोड़ी के साथ एक निर्देशित ग्राफ है। जबकि इसके व्यावहारिक रूप से एक अर्थ में, इसमें बहुत से अनपेक्षित स्थलीय परिणाम हैं। भले ही, ऐसा लगता है कि django इसे मूल रूप से समर्थन नहीं करता है। हालांकि एम 2 एम संबंध किसी अन्य मॉडल के माध्यम से रखना संभव हो सकता है और वांछित रिश्ते को फिर से बनाने के लिए मॉडल में थोड़ा सा तर्क डालना संभव हो सकता है। एक पूरी तरह से वैध जवाब नहीं है, लेकिन यह जीवन है। – Shayne

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