2009-05-21 12 views
21

मैं एक Django आवेदन है, जो काफी जटिल मॉडल (यह मॉडल एक विश्वविद्यालय - पाठ्यक्रम, मॉड्यूल, व्याख्यान, छात्रों आदि) है विकसित करने के बीच में हूँDjango अनुप्रयोग निर्भरता साइकिल

मैं क्षुधा में परियोजना अलग किया है , पूरी चीज को अधिक संगठित करने के लिए (ऐप्स पाठ्यक्रम, स्कूल, लोग, मॉड्यूल और टाइमपेरियोड हैं)। मुझे एक समस्या है जिससे एक ऐप में एक मॉडल दूसरे मॉडल पर निर्भर हो सकता है - इसलिए मुझे इसे आयात करना होगा। बदले में दूसरा ऐप पहले मॉडल पर निर्भर करता है, इसलिए एक चक्र होता है और पायथन एक त्रुटि फेंकता है।

लोग इससे कैसे निपटते हैं? मैं समझता हूं कि ऐप्स अपेक्षाकृत "स्वतंत्र" होना चाहिए, लेकिन इस तरह की एक प्रणाली में यह समझ में नहीं आता है, उदाहरण के लिए, छात्रों को मॉड्यूल से जोड़ने के लिए ContentTypes का उपयोग करना।

क्या किसी के पास ऐसी ही परियोजना है जो इस मामले पर टिप्पणी कर सकती है?

+0

आपका परिदृश्य ऐसा नहीं लगता है कि ऐप्स के लिए बनाया गया था। ऐप्स का विचार पुन: प्रयोज्यता (अलग पैकेजिंग, वितरण और संस्करण के साथ) है। आप अपने विषय क्षेत्रों को अलग-अलग ऐप्स में मजबूर नहीं कर अपने आप को कुछ परेशानी बचा सकते हैं। –

उत्तर

52

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

class MyModel(models.Model): 
    myfield = models.ForeignKey('myotherapp.MyOtherModel') 

इस तरह MyOtherModel, इसलिए कोई वृत्तीय संदर्भ आयात करने के लिए कोई आवश्यकता नहीं है। Django आंतरिक रूप से स्ट्रिंग को हल करता है, और यह सब उम्मीद के अनुसार काम करता है।

+0

बहुत खुबस। यही वह है जिसकी तलाश में मैं हूं। काफी हद तक मुझे पता था कि आप ऐसा कर सकते हैं - क्योंकि मैं उन स्थानों पर इसका उपयोग करता हूं जहां विदेशीकी फ़ाइल में बाद में परिभाषित कुछ का संदर्भ देता है, लेकिन मैंने इसे इस तरह से उपयोग करने का कभी सोचा नहीं। आपका बहुत बहुत धन्यवाद! –

+0

धन्यवाद धन्यवाद। बहुत बढ़ोतरी को रोक दिया गया है। –

+1

हुरेय! यह http://docs.djangoproject.com – slacy

1

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

3

आप परिपत्र मॉडल निर्भरता मेरा अनुमान है कि यह है कि तीन चीजों में से एक हो रहा है देख रहे हैं:

  • आप एक के लिए एक व्युत्क्रम संबंध कि पहले से ही उदाहरण दोनों कोर्स के लिए निर्धारित किया है (परिभाषित किया है कई व्याख्यान है और व्याख्यान एक पाठ्यक्रम) जो Django में अनावश्यक
  • तुम गलत एप्लिकेशन
  • आप एक मॉडल विधि में कार्यक्षमता प्रदान कर रहे हैं में एक मॉडल विधि है कि एक प्रबंधक में होना चाहिए

शायद आप हमें दिखा सकते हैं कि इन मॉडलों में क्या हो रहा है और हम यह पता लगाने की कोशिश कर सकते हैं कि समस्या क्यों उत्पन्न हो रही है। परिपत्र मॉडल निर्भरता शायद ही कभी एक संकेत है कि आपको दो ऐप्स को गठबंधन करने की आवश्यकता है - यह अधिक संभावना है (हालांकि निश्चित रूप से मामला नहीं है) कि आपकी मॉडल परिभाषाओं में से कोई एक समस्या है।

पेज। मैं पूर्वाह्न इसी तरह के django अनुप्रयोग पर काम कर रहा हूं, लेकिन मेरी ऐप संरचना शायद आपके लिए काफी अलग है। यदि आप रुचि रखते हैं तो मुझे आपको उच्च स्तर का विवरण देने में खुशी होगी।

+0

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

+0

तो मॉड्यूल और व्यक्ति के बीच संबंध बहुत से हैं (ऐसा लगता है कि यह होना चाहिए)? यदि ऐसा है, तो आप 'student' पर सेट किए गए related_name पैरामीटर वाले व्यक्ति में रिश्ते को परिभाषित कर सकते हैं। फिर module_instance.students.all() आपको वह क्वेरीसेट देगा जो मुझे लगता है कि आप ढूंढ रहे हैं। मेरे मामले में, मेरे पास एक व्यक्ति मॉडल नहीं है। मेरे पास पाठ्यक्रम से उपयोगकर्ता के लिए दो एम 2 एम संबंध हैं, एक छात्रों के लिए और दूसरे शिक्षकों के लिए। इसे बहुत आसान रखता है। – ozan

+0

हाँ यह वर्तमान में ManyToManyField के साथ काम करता है - और मैं इसे व्यक्ति मॉडल पर ले जा सकता हूं - लेकिन यह कम "साफ" लगता है - यह मॉड्यूल मॉडल पर रखना समझ में आता है। मेरे पास एक "व्यक्ति" होना चाहिए क्योंकि यह Django के उपयोगकर्ता को विस्तारित करता है, इसलिए मैं और अधिक कार्यक्षमता (जैसे जॉब विवरण इत्यादि) जोड़ सकता हूं, मैं प्रोफाइल का उपयोग कर सकता था लेकिन उपयोगकर्ताओं के बजाय लोगों को वापस करने के लिए मैंने लिखा कुछ मिडलवेयर के बाद यह आसान है :) –

4

यह आपकी स्थिति के लिए उपयुक्त नहीं हो सकता है, लेकिन आपके प्रश्न के लिए डैंजो पहलू को अनदेखा कर रहा है, परिपत्र निर्भरताओं को तोड़ने के लिए सामान्य तकनीक क्रॉस-रेफरेंस किए गए आइटमों में से एक को एक नए मॉड्यूल में तोड़ना है।उदाहरण के लिए:

moduleA: class1, class2 
      |  ^
      v  | 
moduleB: class3, class4 

बन सकता है:

moduleC: class 3 
     ^
      | 
moduleA: class 1, class 2 
        ^
        | 
moduleB:   class 4 

(। या वैकल्पिक रूप से, आप अपने स्वयं के मॉड्यूल या फिर दोनों में विभाजित वर्ग 2 हो सकता था!) ​​

बेशक

, यह कोई है मदद करें यदि कक्षा ए & बी एक दूसरे पर निर्भर करता है। उस स्थिति में, हो सकता है कि वे एक ही मॉड्यूल में हों, या बेहतर अभी भी हो, शायद इन वर्गों का कुछ हिस्सा तीसरे मॉड्यूल में विभाजित किया जा सकता है, जो दोनों वर्ग निर्भर करते हैं।

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