यह तब तक संभव नहीं है जब तक कि अमूर्त नहीं है, और यहाँ क्यों है: LongNamedRestaurant
एक भी है Place
, न केवल एक वर्ग के रूप में, बल्कि डेटाबेस में भी। स्थान-तालिका में प्रत्येक शुद्ध Place
और प्रत्येक के लिए एक प्रविष्टि है LongNamedRestaurant
। LongNamedRestaurant
बस के साथ एक अतिरिक्त तालिका बनाता हैfood_type
जगह के और स्थान तालिका का संदर्भ देता है।
यदि आप करते हैं Place.objects.all()
, तो आपको हर वह स्थान भी मिलता है जो एक है LongNamedRestaurant
, और यह Place
(बिना food_type
) का एक उदाहरण होगा । इसलिए Place.name
और LongNamedRestaurant.name
समान डेटाबेस कॉलम साझा करें, और इसलिए उसी प्रकार का होना चाहिए।
मुझे लगता है कि यह सामान्य मॉडल के लिए समझ में आता है: हर रेस्तरां एक जगह है, और उस जगह पर कम से कम सब कुछ होना चाहिए। शायद यह स्थिरता भी है कि 1.10 से पहले अमूर्त मॉडल के लिए यह क्यों संभव नहीं था, हालांकि यह डेटाबेस की समस्याओं को नहीं देगा। @Lampslave की टिप्पणी के अनुसार, इसे 1.10 में संभव बनाया गया था। मैं व्यक्तिगत रूप से देखभाल की सलाह दूंगा: यदि Sub.x Super.x को ओवरराइड करता है, तो सुनिश्चित करें कि Sub.x Super.x का उपवर्ग है, अन्यथा Super के स्थान पर Sub का उपयोग नहीं किया जा सकता।
वर्कअराउंड : आप एक कस्टम उपयोगकर्ता मॉडल ( AUTH_USER_MODEL
) बना सकते हैं, जिसमें कोड डुप्लिकेट का थोड़ा बहुत समावेश होता है, यदि आपको केवल ईमेल फ़ील्ड को बदलने की आवश्यकता है। वैकल्पिक रूप से आप ईमेल छोड़ सकते हैं जैसा कि यह है और सुनिश्चित करें कि यह सभी रूपों में आवश्यक है। यह डेटाबेस अखंडता की गारंटी नहीं देता है यदि अन्य अनुप्रयोग इसका उपयोग करते हैं, और दूसरे तरीके से काम नहीं करते हैं (यदि आप उपयोगकर्ता नाम बनाना चाहते हैं तो आवश्यक नहीं है)।