2009-12-10 12 views
20

यह एक बहुत ही सरल django पैटर्न सवाल है। मेरा प्रबंधक कोड आमतौर पर models.py में रहता है, लेकिन क्या होता है जब models.py वास्तव में बड़ा होता है? क्या आपके प्रबंधक कोड को रखरखाव के लिए models.py में रहने और परिपत्र आयात से बचने के लिए कोई अन्य वैकल्पिक पैटर्न है?django प्रबंधक कोड कहाँ रहना चाहिए?

एक सवाल पूछा जा सकता है कि models.py इतना बड़ा क्यों है, लेकिन आइए बस मान लें कि इसका आकार और उपयोगिता की चौड़ाई उचित है।

उत्तर

21

मैं अपने मॉडलों को man.py.py में man.py और प्रबंधकों में रखना चाहता हूं (form.py में फॉर्म) सभी एक ही ऐप के भीतर। अधिक सामान्य प्रबंधकों के लिए, मैं उन्हें कोर.मैनेजर में रखना पसंद करता हूं अगर उन्हें अन्य ऐप्स के लिए फिर से उपयोग किया जा सकता है। मॉडल/modelname.py के साथ हमारे कुछ बड़े ऐप्स में एक प्रबंधक और मॉडल कोड होगा जो खराब नहीं लगता है।

+1

फिर मैन्युअल रूप से man.py.py और इसके विपरीत आयात करने की आवश्यकता वाले mod.py के साथ कैसे निपटें? – Jeff

+24

प्रबंधकों को मॉडल आयात करने की आवश्यकता नहीं है - प्रश्न में मॉडल हमेशा प्रबंधक पर 'self.model' के रूप में उपलब्ध होगा। – jacobian

+5

यह बढ़िया है ... जब तक कि आपके प्रबंधक की क्वेरीसेट को किसी अन्य मॉडल का संदर्भ देने की आवश्यकता न हो - तब आप इसे आयात नहीं कर सकते हैं, और इसे models.py में रखना होगा (उदाहरण के लिए यदि आप किसी अन्य मॉडल में मौजूद वस्तुओं को छोड़ रहे हैं)। –

3

Django ऐप्स बनाने के दौरान मैंने क्या किया था [मॉडल नाम] .py फ़ाइल केवल विशिष्ट मॉडल कोड, मैनेजर कोड और कभी-कभी फॉर्म कोड के साथ बनाना था और सभी को मॉडल निर्देशिका में आयात करने के लिए __init__.py फ़ाइल का उपयोग किया गया था। इससे मुझे इसे कमजोर रखने में कम से कम मदद मिली।

+0

अगर मैं ऐसा करने जा रहा था, तो मैं इन सभी फ़ाइलों को 'मॉडल' फ़ोल्डर में रखूंगा। यह ऐप को रूट को साफ रखेगा और आयात को बेहतर तरीके से व्यवस्थित करेगा। – jangeador

6

मैं हमेशा managers.py में अपना स्थान रखता हूं। यदि आपके पास गोलाकार आयात समस्या है तो याद रखें कि ए) आप स्वयं के मॉडल में प्रबंधक के लिए मॉडल क्लास का संदर्भ दे सकते हैं, और बी) आप कार्यों के अंदर आयात कर सकते हैं।

+0

+1 हमें याद दिलाने के लिए कि आप किसी फ़ंक्शन के अंदर आयात कर सकते हैं। मेरे मामले में मुझे अपने प्रबंधक के लिए बाहरी मॉडल का उपयोग करना पड़ा और मैंने विधि के अंदर '' apps.get_model (app_label = 'app_name', model_name = 'model_name') '' जोड़ा – jangeador

7

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

आपको केवल प्रत्येक मॉडल को अपने __init__.py के नामस्थान में आयात करने की आवश्यकता होगी।

yourapp/ 
    models/ 
     __init__.py # This file should import anything from your other files in this directory 
     basic.py # Just an example name 
     morespecificmodels.py # Just an example name 
     managers.py # Might want to separate your manager into this 

फिर अपने __init__.py बस हो सकता है:

तो, उदाहरण के लिए, आप में अलग करने के लिए चाहते हो सकता है

from basic import * # You should replace * with each models name, most likely. 
from managers import YourManager # Whatever your manager is called. 

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

उम्मीद है कि इससे मदद मिलती है।

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