2011-06-16 16 views
26

मैं कुछ कोड है कि इस तरह दिखता है मिल गया है से एक मॉडल फील्ड का डिफ़ॉल्ट मान ओवरराइड करने के लिए कैसे:एक सार बेस कक्षा

class BaseMessage(models.Model): 
    is_public = models.BooleanField(default=False) 
    # some more fields... 

    class Meta: 
     abstract = True 

class Message(BaseMessage): 
    # some fields... 

और मैं is_public क्षेत्र का डिफ़ॉल्ट मान ओवरराइड करना चाहते हैं संदेश मॉडल में ताकि यह उस मॉडल के लिए True है।

मैंने कुछ प्रासंगिक Django दस्तावेज़ों को देखा है और मॉडल ऑब्जेक्ट्स के चारों ओर पोक किया है, लेकिन मुझे ऐसा करने के लिए सही जगह खोजने में परेशानी हो रही है। कोई सुझाव?

उत्तर

29

आप वास्तव में यह इस प्रकार कर सकते हैं:

class BaseMessage(models.Model): 
    is_public = models.BooleanField(default=False) 
    # some more fields... 

    class Meta: 
     abstract = True 

class Message(BaseMessage): 
    # some fields... 
Message._meta.get_field('is_public').default = True 

मैं इस एक या दो बार किया है। यह काम करता है, क्योंकि संदेश पर फ़ील्ड बेसमेसेज के क्षेत्र की तुलना में एक अलग उदाहरण है। हालांकि, मुझे संदेह है कि इसकी अनुशंसा की जाती है ;-) यह इस बात पर निर्भर करता है कि वर्तमान में django internals कैसे काम करते हैं, इसलिए इस बात की कोई गारंटी नहीं है कि यह हमेशा के लिए काम करेगा।

+5

यह मेरे लिए काम किया। मेरे मामले में मैं सहायता पाठ ओवरराइड कर रहा था। इस कोड को प्रारंभकर्ता में स्थानांतरित करने के लिए और अधिक समझदारी हुई, इसलिए मेरे पास है: def __init __ (स्वयं, * तर्क, ** kwargs): सुपर (MyModelClass, self) .__ init __ (* args, ** kwargs) self._meta.get_field ('mymodelfield')। help_text = self.help_text() – Mark

+3

मैं इसे "अद्वितीय" विशेषता के लिए आज़माता हूं, लेकिन मुझे यह मिलता है: 'विशेषता त्रुटि: विशेषता सेट नहीं कर सकता'। – guettli

+4

@guettli वही यहाँ। 'अद्वितीय' सेट करने के लिए काम नहीं कर रहा है। यह Django 1.7 पर है। –

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