2012-10-30 11 views
6

मेरे पास सिस्टम मॉडल है, और इंटरफ़ेस मॉडल है। एक इंटरफेस दो प्रणालियों के बीच संयोजन है। इससे पहले, इस इंटरफेस को एक्सेल शीट (क्रॉस टेबल) के रूप में दर्शाया गया था। अब मैं इसे डेटाबेस में स्टोर करना चाहता हूं।Django क्रॉस टेबल मॉडल संरचना

मैंने सिस्टम के लिए दो विदेशी कुंजी के साथ एक इंटरफेस मॉडल बनाने की कोशिश की। इसका कारण यह है काम नहीं करता:

  • यह लक्ष्य मॉडल पर दो अलग-अलग रिवर्स रिश्ते बनाता है
  • यह डुप्लिकेट होने से बचने नहीं करता है (पहले और दूसरे rel बदली)

मैं इस कोड का इस्तेमाल किया :

class SystemInterface(Interface): 
    assigned_to = models.ManyToManyField(User) 
    first_system = models.ForeignKey(System) 
    second_system = models.ForeignKey(System) 

क्या ऐसा करने का कोई बेहतर तरीका नहीं है?

मुझे सममित संबंध होना चाहिए: इससे कोई फर्क नहीं पड़ता कि एक इंटरफ़ेस में सिस्टम "पहला" या "दूसरा" है।

+0

क्या पदानुक्रम पहला है और दूसरा सिस्टम आपके लिए महत्वपूर्ण है? या दो प्रणालियों के साथ संबंध महत्वपूर्ण है? – jondykeman

+0

कोई फर्क नहीं पड़ता। मैं रिश्ते को सममित होना चाहता हूं। पहला = ए; दूसरा = बी पहले = बी के बराबर होना चाहिए; दूसरा = – pistache

+0

क्या आप कृपया बता सकते हैं कि "यह लक्ष्य मॉडल पर दो अलग-अलग रिवर्स रिश्तों को बनाता है"? – stellarchariot

उत्तर

4

मुझे लगता है कि सबसे अच्छा simpliest उन मॉडलों का प्रतिनिधित्व करने के इस तरह होगा:

class System(models.Model): 
    pass 

class Interface(models.Model): 
    assigned_to = models.ManyToManyField(to=User) 
    system = models.ForeignKey(System) 

    @property 
    def systems(self): 
     Interface.objects.get(system=self.system).interfacedsystem_set.all()   

class InterfacedSystem(models.Model): 
    interface = models.ForeignKey(Interface) 
    system = models.ForeignKey(System) 

जोड़ें/interfaced प्रणाली के निकाले जाने की स्पष्ट रूप से पाठक के लिए एक व्यायाम के रूप में छोड़ दिया जाता है, पुट काफी आसान होना चाहिए।

+0

यह बहुत ही रोचक जवाब है, मैं इसे और अधिक सटीक रूप से देखने जा रहा हूं, और आपको वापस ले जाऊंगा। धन्यवाद – pistache

+0

अभी तक ठीक दिखता है :) धन्यवाद – pistache

2

आप कई रिश्ते with extra fields पर कई लोगों का उपयोग कर सकते हैं, लेकिन यह symetrical नहीं हो सकता है।

कई संबंधों के लिए उपयोग की जाने वाली तालिका में 2 मॉडल के बीच प्रति संबंध पंक्ति होती है। सिस्टम से स्वयं से कई संबंधों के लिए उपयोग की जाने वाली तालिका में दो प्रणालियों के बीच प्रति पंक्ति एक पंक्ति है। यह इस तथ्य के अनुरूप है कि आपका मॉडल ManyToManyField.through के लिए उपयोग किए गए मॉडल की संरचना को फिट करता है।

मध्यस्थ मॉडल का उपयोग करके कई तालिकाओं में निर्दिष्ट_to जैसे फ़ील्ड जोड़ने की अनुमति मिलती है।

यह समझना मुश्किल हो सकता है, लेकिन यह ( ख left_system = system_ एक, right_system = system_ ) SystemInterface के निर्माण रोकने चाहिए। ध्यान दें कि मैंने कई लोगों को "बाएं" पक्ष और "दाएं" पक्ष का प्रतिनिधित्व करने के उद्देश्य से "दाएं" द्वारा "बाएं" और "दूसरा" द्वारा "दूसरा" बदल दिया है।

क्योंकि वे सममित नहीं किया जा सकता, यह (left_system = system_ एक, right_system = system_ ख) एक SystemInterface होने की समस्या का समाधान और (ख SystemInterface के साथ एक left_system = system_ नहीं होगा, right_system = system_ )। आपको SystemInterface के clean() method में होने से रोकने या किसी भी मॉडल को कईToManyField.through मॉडल के साथ कई तालिकाओं में प्रतिनिधित्व करने के लिए उपयोग किया जाना चाहिए।

+0

से और किस मॉडल के लिए? – pistache

+0

स्वयं को सिस्टम, क्या आपने लिंक पढ़े ?? – jpic

+0

क्षमा करें मैं नहीं देख सकता कि यह मेरी मदद कैसे कर सकता है। एक इंटरफेस केवल दो प्रणालियों के बीच है, और अधिक नहीं। – pistache

2

चूंकि django अतिरिक्त डेटा के साथ समेकित कई से अधिक रिश्तों का समर्थन नहीं करता है, इसलिए आपको शायद इसे स्वयं लागू करने की आवश्यकता है।

यदि आपके पास सिस्टम में एक सुविधाजनक अपरिवर्तनीय मूल्य है (उदा। सिस्टम आईडी), तो आप एक अनुमानित एल्गोरिदम बना सकते हैं जिसके लिए आपकी तालिका में कौन सी प्रविष्टि संग्रहीत की जाएगी। यदि आप इंटरफ़ेस ऑब्जेक्ट बनाते समय सिस्टम हमेशा लगातार रहते हैं, तो आप प्राथमिक कुंजी का उपयोग कर सकते हैं।

फिर इंटरफ़ेस बनाने के लिए एक फ़ंक्शन लिखें।उदाहरण के लिए:

class System(models.Model): 
def addInterface(self, other_system, user): 
    system_interface = SystemInterface() 
    system_interface.assigned_to = user 
    if other_system.id < self.id: 
     system_interface.first_system = other_system 
     system_interface.second_system = self 
    else: 
     system_interface.first_system = self 
     system_interface.second_system = other_system 
    system_interface.save() 
    return system_interface 

इस डिजाइन का उपयोग करना, आप हमेशा की तरह सत्यापन, दोहराव का पता लगाने, SystemInterface वस्तु पर आदि कर सकते हैं। मुख्य बिंदु यह है कि आप डेटा मॉडल की बजाय अपने कोड में बाधा को लागू करते हैं।

क्या यह समझ में आता है?

+0

ऐसा करता है, वैसे भी अगर मैं कुछ और नहीं मिला तो मैं क्या करूँगा। हालांकि, सिस्टम इंटरफेस मैनेजर में यह कोड बेहतर नहीं होगा? क्योंकि आपके रास्ते का उपयोग करके, मैं कुशलता से व्यवस्थापक इंटरफ़ेस का उपयोग करने में सक्षम नहीं होगा। – pistache

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