2011-03-21 11 views
6

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

class ContentItem(models.Model): 
    title = models.CharField(max_length=1000) 
    page_order = models.IntegerField() 
    last_update_date = models.DateTimeField(default=datetime.now()) 

    class Meta: 
     abstract = True 
     ordering = ['page_order', 'last_update_date', 'title'] 

यह सभी सामग्री मदों के लिए आधार वर्ग है:

मेरे मॉडलिंग कोड में, मैं एक आधार वर्ग की है। पृष्ठ आदेश पृष्ठ पर यह किस स्थिति को नियंत्रित करता है, उदाहरण के लिए पेज_ऑर्डर = 0 वाला आइटम पृष्ठ के शीर्ष पर होना चाहिए। इसके बाद मैं कुछ विशिष्ट सामग्री मॉडल परिभाषित करता हूं जो इस से प्राप्त होते हैं।

class LinkContent(ContentItem): 
    url = models.URLField() 
    link_text = models.CharField(max_lenth=1000) 

class TextContent(ContentItem): 
text = models.CharField() 


class VideoContent(ContentItem): 
     title = models.CharField() 
     video_file = models.FieldField(upload_to = 'videos') 

ऐसे कई सामग्री प्रकार हो सकते हैं। फिर मैं एक पृष्ठ मॉडल को परिभाषित करता हूं जो सभी विभिन्न सामग्री प्रकारों से बना होता है। आदर्श रूप में, मैं आधार प्रकार के आधार पर सभी प्रकार के संबंधों में डाल सकता हूं। तो इस संबंध में आपके पास लिंककंटेंट्स, टेक्स्टकंटेंट्स और वीडियोकंट्स का मिश्रण होगा। टेम्पलेट को प्रस्तुत करते समय पेज पर उनके ऑर्डर को निर्धारित करने के लिए उन्हें पेज_ऑर्डर द्वारा सॉर्ट किया जाएगा।

class Page(models.Model): 
    contents = models.ManyToManyField(ContentItem) 
    title = models.CharField() 

क्या ऐसी योजना बनाने का कोई तरीका है? या क्या यह समस्याग्रस्त है कि इसमें विभिन्न प्रकार के मॉडल के साथ संबंध हो? मुझे पता है कि यह एक अच्छा समाधान है और ऑब्जेक्ट उन्मुख प्रोग्रामिंग दृष्टिकोण है, मूल रूप से मेरे लाभ के लिए बहुरूपता का उपयोग कर रहा है, लेकिन मुझे यकीन नहीं है कि यह डेटाबेस स्तर पर समझ में आता है।

मैं बजाय कुछ इस तरह अधिक की आवश्यकता है:

class Page(models.Model): 
    video_contents = models.ManyToManyField(VideoContent) 
    link_contents = models.ManyToManyField(LinkContent) 
    text_contents = models.ManyToManyField(TextContent) 
    title = models.CharField() 

मैं जानता हूँ कि यह काम करेगा, लेकिन पृष्ठ पर वस्तुओं की नियुक्ति का निर्धारण करने का मेरा योजना और अधिक कठिन हो जाता है। मुझे सभी सामग्री संबंधों को पार करने की आवश्यकता होगी, उन्हें पेज_ऑर्डर द्वारा क्रमबद्ध करें और फिर उन्हें प्रस्तुत करें।

मुझे लगता है कि दोनों मामलों में, मैं आधार वर्ग पर एक रेंडर() विधि घोषित करना चाहता हूं कि प्रत्येक विशिष्ट सामग्री प्रकार का उत्तराधिकारी हो। इस तरह यदि मेरे पास ContentItems की एक सूची है तो मैं अपने विशिष्ट प्रकार के बारे में चिंता किए बिना उन्हें प्रस्तुत करने के लिए बतख टाइपिंग का उपयोग कर सकता हूं।

मेरा अंतिम सवाल यह है कि मैं व्यवस्थापक के साथ इस जगह को कैसे अच्छा बना सकता हूं? मैं उन सभी सामग्री आइटम्स को देखने का एक आसान तरीका कैसे बना सकता हूं जो एक दृश्य में एक पृष्ठ बनाते हैं, ताकि उन्हें पेज_ऑर्डर बदलकर आसानी से स्थानांतरित किया जा सके?

इस के पढ़ने के लिए धन्यवाद, अगर आपको अधिक जानकारी चाहिए तो मुझे बताएं।

उत्तर

3

यह करने का यह एक अच्छा तरीका है। दुर्भाग्य से, Django का ओआरएम मॉडल विरासत को आसानी से संभालने में सक्षम नहीं है जैसा आप चाहें। page.contents में Content ऑब्जेक्ट्स का एक क्वेरीसेट होगा। यदि आप उपप्रकारों तक पहुंचना चाहते हैं, तो आपको किसी सामग्री ऑब्जेक्ट को कम करने का कोई तरीका बनाना होगा। समस्या यह है कि इसके लिए प्रति वस्तु एक प्रश्न की आवश्यकता होती है, जो तेजी से हाथ से बाहर निकल सकता है। This blog post दृश्यों के पीछे select_related() का उपयोग करके, एक क्वेरीसेट में मिश्रित उपप्रकार प्राप्त करने के लिए एक तकनीक का वर्णन करता है।

+1

धन्यवाद @jcdyer। वह बहुत उपयोगी जानकारी थी। एक बात मैं अभी भी अस्पष्ट नहीं हूं हालांकि मैं यह काम व्यवस्थापक इंटरफ़ेस में कैसे करूँगा। आदर्श रूप में, मैं पृष्ठ की सामग्री को सूचीबद्ध करने का एक तरीका चाहता हूं और विशिष्ट वर्ग के आधार पर आइटम के लिए उपयुक्त व्यवस्थापक फ़ॉर्म दिखाया जाना चाहिए। उदाहरण के लिए, यदि किसी पृष्ठ में इसकी सामग्री विशेषता में 2 लिंक सामग्री और 1 टेक्स्ट सामग्री है, तो मैं चाहता हूं कि पहले दो लिंक फ़ॉर्म के साथ संपादन योग्य हों और दूसरा टेक्स्ट फॉर्म के साथ। क्या ऐसा कुछ करने का कोई आसान तरीका है? मैंने बहुत सारे व्यवस्थापक अनुकूलन किए हैं, लेकिन ऐसा कुछ भी नहीं देखा है। – Jon

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