2011-05-11 29 views
12

मैं कुछ हद तक एक Django शुरुआत कर रहा हूं और जितना संभव हो सके अपने अनुप्रयोगों को कम करने की कोशिश कर रहा हूं और इसे जितना संभव हो उतना छोटा उपयोग करने योग्य टुकड़ों में बना सकता हूं। re-usable apps बनाने की जेम्स बेनेट की रणनीति का पालन करने का प्रयास कर रहे हैं। इस बात को ध्यान में रखते हुए, मैं इस समस्या से आया।पुन: प्रयोज्य Django ऐप्स बनाना?

चलो कहते हैं कि मैं एक ऐप्लिकेशन है जो फिल्मों के बारे में जानकारी संग्रहीत करता था करते हैं:

कोड कुछ इस तरह दिखेगा: अब

class Movie(models.Model): 
    name = models.CharField(max_length=255) 
    ... 

, अगर मैं रेटिंग्स जोड़ना चाहते थे, मैं इस्तेमाल कर सकते हैं Django रेटिंग और केवल अपने मॉडल के लिए एक क्षेत्र को जोड़ने:

class Movie(models.Model): 
    name = models.CharField(max_length=255) 
    rating = RatingField(range=5) 
    ... 

यह पूरी तरह से मतलब है कि मेरी फिल्म एप्लिकेशन अब पर Django-रेटिंग्स निर्भर है और मैं इसे फिर से उपयोग करना चाहता था, लेकिन अब जरूरत रेटिंग्स अगर, मुझे अभी भी django-rating को स्थापित करना होगा या संशोधित करना होगा और मेरे ऐप को फोर्क करना होगा।

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

यह दो मॉडलों को अलग करने और मूवी के बजाय रेटिंग मॉडल में रिश्ते को परिभाषित करने के लिए और अधिक समझदार लगता है। इस तरह निर्भरता परिभाषित की जाती है जब मैं रेटिंग का उपयोग करता हूं, लेकिन मूवी ऐप का उपयोग करते समय इसकी आवश्यकता नहीं होती है।

आप इस समस्या से कैसे निपटते हैं? मॉडल को अलग करने के लिए कोई बेहतर तरीका है?

मुझे यह भी आश्चर्य है कि ऐसा करने में कोई बड़ी प्रदर्शन दंड है या नहीं।

संपादित करें: मैं यह स्पष्ट करना चाहता हूं कि यह समस्या का एक उदाहरण है और एक बिंदु को चित्रित करने के लिए कुछ हद तक योगदान हुआ है। जब भी मुझे संबंधित डेटा जोड़ने की आवश्यकता होती है, तो मैं "मूवी" मॉडल को संशोधित किए बिना अतिरिक्त जानकारी जोड़ने में सक्षम होना चाहता हूं। मैं अब तक प्रतिक्रियाओं की सराहना करता हूं।

+3

मुझे आपकी सभी फिल्में, आदमी से प्यार है। – zeekay

उत्तर

4

इस मामले में, व्यक्तिगत रूप से, मैं इसे सरल रखता हूं और मॉडल पर rating छोड़ देता हूं। आपको कार्यान्वयन की सादगी के साथ पुन: प्रयोज्यता को संतुलित करना होगा। चीजों को पुन: प्रयोज्य बनाना बहुत अच्छा है, लेकिन क्या आपका Movie मॉडल वास्तव में अतिरिक्त काम करने के लिए पर्याप्त उपयोगी है? और क्या यह निर्भरता है कि निर्भरता हो? मुझे लगता है कि इनमें से अधिकतर डिजाइन निर्णय व्यक्तिपरक हैं। इस विषय पर पिकॉन में इस साल एक अच्छी बात थी: http://blip.tv/file/4882961

1

सबसे पहले, मैं उपरोक्त zeekay से सहमत हूं, आपको आत्मनिरीक्षण करना चाहिए कि क्या आपके मॉडल के लिए पुन: प्रयोज्यता की मात्रा इसके लायक है या नहीं।

यह वास्तव में है, तो आप एक RatingModel कि movies.models.Movie को FK है और rating क्षेत्र है कि एक नए movierating एप्लिकेशन बना सकते हैं।

आप टेम्पलेट्स को किसी भी तरह कभी भी कम नहीं करेंगे। इसके लिए, आप class-based-views बना सकते हैं और movierating.views में आप get_context विधि को बढ़ा और ओवरराइड कर सकते हैं।

भूल पुनर्प्रयोग को प्राप्त एक मौलिक मूल्य निर्णय बनाने और अधिक कर रही है यह रूप में बुरा के रूप में पहली जगह में यह नहीं कर रही हो सकता है नहीं है एक डेवलपर है मत करो।

0

निर्भरता होने के कारण यह एक बुरी चीज नहीं है। किसी फ़ील्ड (रेटिंग, टाइमडेल्टा, जेएसओएन ऑब्जेक्ट) जैसी किसी चीज़ के लिए, जहां कोई अंतर्निहित फ़ील्ड नहीं है जो आपको आवश्यक एक अलग ऐप शामिल करने के लिए करता है (और शायद कुछ संबंधित कार्यक्षमता, जैसे टेम्पलेट टैग) एक सुविधा है, एक बग नहीं

अधिकतर समस्या तब होती है जब आपके ऐप्स के मॉडल अन्य ऐप्स से मॉडलों का संदर्भ देते हैं। बेशक, यह असली दुनिया में होता है, लेकिन उस स्थिति में, यह अलग मॉडल की पहचान करना अधिक कठिन बनाता है।

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