2012-10-08 10 views
8

का उपयोग कर मुझे How to query abstract-class-based objects in Django? धागा mult_table_inheritance का उपयोग करने का सुझाव देता है। मैं व्यक्तिगत रूप सेDjango: ContentType बनाम multi_table_inheritance

पिछले लिंक के उदाहरण का उपयोग, मैं बस के रूप में

class StellarType(models.Model): 
    """ 
    Use ContentType so we have a single access to all types 
    """ 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

तो इस ऐड एक StelarType जोड़ना होगा content_type अधिक धारणात्मक आरामदायक (बस, तर्क के अधिक करीब महसूस करता है कम से कम मेरे लिए) का उपयोग कर लगता है सार बेस मॉडल

class StellarObject(BaseModel): 
    title = models.CharField(max_length=255) 
    description = models.TextField() 
    slug = models.SlugField(blank=True, null=True) 
    stellartype = generic.GenericForeignKey(StellarType) 
    class Meta: 
     abstract = True 

StellarObject और StellarType के बीच सिंक करने के लिए करने के लिए, हम एक StellarType उदाहरण हर बार किसी ग्रह या तारे बनाई गई है बनाने के लिए post_save संकेत कनेक्ट कर सकते हैं। इस तरह, मैं StellarTbpe के माध्यम से StellarObjects से पूछताछ कर सकते हैं। तो मैं जानना चाहता हूं कि multi_table_inheritance का उपयोग करने के विरुद्ध इस दृष्टिकोण का उपयोग करने के प्रो और कॉन क्या हैं? मुझे लगता है कि दोनों डेटाबेस में एक अतिरिक्त टेबल बनाते हैं। लेकिन डेटाबेस प्रदर्शन के बारे में कैसे? उपयोगिता/लचीलापन के बारे में कैसे? आपके किसी भी इनपुट के लिए धन्यवाद!

उत्तर

5

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

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

मल्टी-टेबल विरासत का प्रमुख समर्थक मेरे लिए एक क्लीनर डाटा मॉडल, अंतर्निहित रिश्ते और विरासत है कि अजगर तरफ का लाभ लिया जा सकता है के साथ है । कंटेंटटाइप का प्रमुख समर्थक यह है कि यह अधिक सामान्य है और थोड़ा सा प्रिस्टिन स्कीमा (इन संबंधों को परिभाषित करने के लिए आपके मॉडल पर "मेटा" फ़ील्ड के बहुत से) की लागत पर आपके मॉडल से सहायक कार्यक्षमता रखता है। और आपके उदाहरण के लिए, आपको अभी भी post_save पर भरोसा करना है, जो मुझे अनावश्यक रूप से गन्दा/जादुई लगता है।

+0

मुझे असंबद्ध चीजों के लिए ContentTypes ढांचे का उपयोग करने के बारे में एक ही भावना है, लेकिन मुझे मल्टी-टेबल विरासत का उपयोग करके थोड़ा असहज महसूस होता है।सर्वोत्तम प्रथाओं की दुनिया में निर्देशित होने की कोशिश करते हुए, मैंने पाइडनी की पुस्तक (2 स्कूप्स) में पढ़ा है कि बहु-टेबल बुरा है। अंतिम सवाल यह है: क्षमता या गठबंधन? – lborgav

+2

मैं * प्यार * दो स्कूप्स, लेकिन बहु-टेबल विरासत के खिलाफ कंबल सलाह मैं वास्तव में समझ में नहीं आता है। आपको केवल उन प्रश्नों को समझना होगा जो आपके आवेदन के लिए जेनरेट किए जा रहे हैं और क्या वे किसी समस्या का प्रतिनिधित्व करते हैं। यदि आप सुपरटाइप टेबल पर अपना अधिकांश काम कर सकते हैं, तो यह विशेष रूप से असंवेदनशील है। मैं नहीं सोच सकता कि एक सुपरटेप टेबल से पूछताछ और उपप्रकारों में शामिल होने के कारण एक सामान्य दृष्टिकोण टाइप टेबल के लिए प्रदर्शन प्रदर्शन बिंदु से ऐसा करने से भी बुरा होना चाहिए। मैं देख सकता हूं कि आप वास्तव में जटिल प्रकार के पदानुक्रम से बचना क्यों चाहते हैं ... – acjay

+1

मैं आपसे सहमत हूं। और इसे संभालने का एक अच्छा तरीका ढूंढने के लिए मैंने अभी यह ऐप (डीजेंगो-मॉडल-यूटिल) पाया है जो बहुत उपयोगी लगता है: [विरासत प्रबंधक] (https://django-model-utils.readthedocs.org/en/ नवीनतम/managers.html) – lborgav

0

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

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